Multiplex assessment of protein variant abundance by massively parallel sequencing VAMP-seq - multiplex assay that uses fluorescent reporters to measure the steady-state abundance of protein variants in cultured human cells (each cellexpresses a single variant directly fused to EGFP…the stability of the variant dictates the abundance of the EGFP fusion and, accordingly, the green fluorescence signal of the cell) - used to assess PTEN and TPMT variants

par(pch=20, cex=.6)
pten1_data <- read.delim('~/leklab/leklab/pten1.txt')
pten1_proc <- pten1_data[!is.na(pten1_data$abundance_class),]
dd <- data.frame(pten1_proc$abundance_class,pten1_proc$score)
colnames(dd) <- c("abundance_class", "score")
tpmt1_data <- read.delim('~/leklab/leklab/tpmt_suppl_2.txt')
tpmt1_proc <- tpmt1_data[!is.na(tpmt1_data$abundance_class),]
ee <- data.frame(tpmt1_proc$abundance_class,tpmt1_proc$score)
colnames(ee) <- c("abundance_class", "score")
dd$protein <- rep("PTEN", nrow(dd))
ee$protein <- rep("TPMT", nrow(ee))
ff = data.frame(rbind(dd, ee))
bbpp = boxplot(score~protein+abundance_class, data = ff, at = c(1, 1.8, 3, 3.8, 5, 5.8, 7.2, 8), xaxt='n', col = c('white', 'gray'))
axis(side=1, at=c(1.4, 3.4, 5.4, 7.6), labels=c('low', 'possibly low', 'possibly\n wt-like', 'wt-like'))
title('VAMP-seq scores of PTEN and TPMT Variants\nand abundance class')

#plot(x = pten1_proc$abundance_class, y = pten1_proc$score,type='p', main = "PTEN", xlab = "Abundance", ylab = "VAMP-seq score", col="#74ABD6")
#points(x = tpmt1_proc$abundance_class, y = tpmt1_proc$score, type='p', col = "#ADDFAD")
# d <- read.table(text = "col_a col_b 
#                         aa    1
#                         ba    1.25
#                         ba    1
#                         ba    1.25
#                         ca    1.3
#                         ca    1.25
#                         da    1.5
#                         da    1.25
#                         aa    1.7
#                         ca    1.25
#                         ba    1.2
#                         da    1.25
#                         aa    1.4
#                         aa    1.25
#                         ca    1.1
#                         aa    1.25", 
#                 header = TRUE,)
# e <- read.table(text = "col_a col_b 
#                         aa    1.6
#                         aa    1.55
#                         ba    1.2
#                         ba    1.45
#                         ca    1.8
#                         ca    1.55
#                         da    1.5
#                         da    1.35
#                         aa    1.9
#                         ca    1.75
#                         ba    1.25
#                         da    1.55
#                         aa    1.45
#                         aa    1.5
#                         ca    1.3
#                         aa    1.75", 
#                 header = TRUE,)
# d$label <- rep(1, nrow(d))
# e$label <- rep(2, nrow(e))
# f = data.frame(rbind(d, e))
# ##f$col_a = pollutant
# ##f$label = location
# bp = boxplot(col_b~label+col_a, data = f, at = c(1, 1.8, 3, 3.8, 5, 5.8, 7.2, 8), xaxt='n', ylim = c(.9, 1.9), col = c('white', 'gray'))
# axis(side=1, at=c(1.4, 3.4, 5.4, 7.6), labels=c('aa', 'ba', 'ca', 'da'), title('practice'))
#plots VAMP-seq score vs abundance_class
VAMP_abundance <- ggplot(ff, aes(x=abundance_class, y=score, fill=protein)) + geom_violin(draw_quantiles = 0.5)+ylab("VAMP-seq score")+xlab("Abundance Class")+theme(legend.title=element_blank(), panel.grid.major = element_line(colour = "grey"), panel.grid.minor = element_line(colour = "grey"))+ggtitle("VAMP-seq scores for each abundance classification")+geom_point(data=data.frame(x="wt-like", y=1, protein = "PTEN"), aes(x,y), colour="black", size=1.5, show.legend=FALSE)+annotate("text", x = "wt-like", y=1.09, label = "WT",colour= "black", size = 4) + scale_y_continuous(minor_breaks = seq(-2, 2, .25))
plot(VAMP_abundance)

#plots helix vs score for PTEN
ggplot(pten1_data, aes(x=as.factor(helix), y=score)) + geom_boxplot()+ylab("VAMP-seq score")

#combining pten1_data and tpmt1_data into one large data frame, differentiate between the two w/ column 'protein' which specifies 'PTEN' or 'TPMT'
pten1_data$protein <- rep("PTEN", nrow(pten1_data))
tpmt1_data$protein <- rep("TPMT", nrow(tpmt1_data))
common_cols <- intersect(colnames(pten1_data), colnames(tpmt1_data))
comb_data = rbind(subset(pten1_data, select = common_cols), subset(tpmt1_data, select = common_cols))
#plots helix vs score for PTEN and TPMT side by side
#no NA
comb_data_helix <- comb_data[!is.na(comb_data$helix),]
#check to see where 3759 rows went off to
ck <- comb_data_helix[!is.na(comb_data_helix$abundance_class),]
comb_data_sheet <- comb_data[!is.na(comb_data$sheet),]
ck1 <- comb_data_sheet[!is.na(comb_data_sheet$abundance_class),]
h_plot <- ggplot(ck, aes(x=as.factor(helix), y=score, fill=protein)) + geom_violin(data=subset(ck, helix==1), draw_quantiles = c(0.5)) + guides(fill=FALSE) + xlab("Alpha Helix") + ylab("VAMP-seq score") + theme(axis.text.x = element_blank()) + scale_y_continuous(limits = c(-.7, 2.03))
s_plot <- ggplot(ck1, aes(x=as.factor(sheet), y=score, fill=protein)) + geom_violin(data=subset(ck1, sheet==1), draw_quantiles = c(0.5)) +  theme(axis.title.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_blank()) + xlab("Beta Sheet") + scale_y_continuous(limits = c(-.7, 2.03)) + guides(fill=FALSE) 
n_plot <- ggplot(ck, aes(x=as.factor(helix), y=score, fill=protein)) + geom_violin(data=subset(ck, helix==0 & sheet==0), draw_quantiles = c( 0.5)) + theme( axis.title.y = element_blank(), axis.text.y = element_blank(), axis.text.x = element_blank(), legend.justification=c(1,0), legend.position=c(.49,.75), legend.title=element_blank(), legend.text = element_text(size=10)) + xlab("Other") + scale_y_continuous(limits = c(-.7, 2.03))
#put the plots side by side
combined <- grid.arrange(h_plot, s_plot, n_plot, ncol=3, top = "Variant scores in relation to position in protein")

##############
##save as pdf
# pdf("violin_Variant_scores_vs.pdf")
# plot(combined)
# plot(VAMP_abundance)
# dev.off()
##############
#works to save single
#ggsave("Variant_scores_protein_position.pdf", plot = combined, device = "pdf", path = "/Users/go2alyssa/Desktop/", scale = 2.6, dpi = "retina")
# graph VAMP-seq scores relative to variant position in protein
#pten
pten1_proc_wt <- pten1_proc[!is.na(pten1_proc$position),]
pten1_proc_wt$secondary_struct <- ifelse(is.na(pten1_proc_wt$helix), "unknown",
                        ifelse(pten1_proc_wt$helix==1, "helix",
                        ifelse(pten1_proc_wt$sheet==1, "sheet",
                        ifelse(pten1_proc_wt$helix==0, "neither",
                        "unknown"))))
pten_pos <- ggplot(pten1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 420, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN scores in relation to protein structure") + geom_vline(xintercept=27, color="black", size=.1) + geom_vline(xintercept=55, color="black", size=.1) + geom_vline(xintercept=70, color="black", size=.1) + geom_vline(xintercept=85, color="black", size=.1) + geom_vline(xintercept=164.5, color="black", size=.1) + geom_vline(xintercept=212, color="black", size=.1) + geom_vline(xintercept=267.5, color="black", size=.1) + geom_vline(xintercept=343.5, color="black", size=.1)
pten_hydro <- ggplot(pten1_proc_wt, aes(x=position, y=score, colour=(hydro2-hydro1)))+ geom_point(size=.3, alpha = 0.3) + scale_x_continuous(minor_breaks = seq(0, 420, 5)) + ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Hydrophobicity")+ggtitle("PTEN scores in relation to change in hydrophobicity") + geom_vline(xintercept=27, color="black", size=.1) + geom_vline(xintercept=55, color="black", size=.1) + geom_vline(xintercept=70, color="black", size=.1) + geom_vline(xintercept=85, color="black", size=.1) + geom_vline(xintercept=164.5, color="black", size=.1) + geom_vline(xintercept=212, color="black", size=.1) + geom_vline(xintercept=267.5, color="black", size=.1) + geom_vline(xintercept=343.5, color="black", size=.1)
#tpmt
tpmt1_proc_wt <- tpmt1_proc[!is.na(tpmt1_proc$position),]
tpmt1_proc_wt$secondary_struct <- ifelse(is.na(tpmt1_proc_wt$helix), "unknown",
                        ifelse(tpmt1_proc_wt$helix==1, "helix",
                        ifelse(tpmt1_proc_wt$sheet==1, "sheet",
                        ifelse(tpmt1_proc_wt$helix==0, "neither",
                        "unknown"))))
tpmt_pos <- ggplot(tpmt1_proc_wt, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
tpmt_colors <- tpmt1_proc_wt
#[order(position, variant),]
tpmt_colors$fact <- rep(10, nrow(tpmt_colors))
temp <- 1
for(i in 1:(length(tpmt_colors$fact)-1)) {
  if (tpmt_colors$secondary_struct[i] != tpmt_colors$secondary_struct[i+1]) {
    tpmt_colors$fact[i] <- temp
    temp <- temp + 1
  } else {
  tpmt_colors$fact[i] <- temp
  }
}
tpmt_colors$fact[length(tpmt_colors$fact)] <- temp
# cc <- 0
# for(i in 1:(length(tpmt_colors$fact)-1)) {
#   if (tpmt_colors$fact[i] != tpmt_colors$fact[i+1]) {
#     print(cc)
#     cc <- 0
#   } else {
#     cc <- cc + 1
#   }
# }
tpmt_pos_vp <- ggplot(tpmt_colors, aes(x=position, y=score))+ geom_violin(data=tpmt_colors[c(1:2783, 2798:4000),], aes(fill=as.character(fact), colour = factor(TRUE)), draw_quantiles = c(0.5), scale = "width") + 
scale_fill_manual(values=c("1" = "#A9A9A9", "2" = "#00C853", "3" = "#FF4848", "4" = "#00C853","5" = "#FF4848", "6" = "#00C853","7" = "#5757FF", "8" = "#00C853","9" = "#FF4848","10" = "#00C853","11" = "#5757FF", "12" = "#00C853","13" = "#FF4848", "14" = "#00C853", "15" = "#5757FF", "16" = "#00C853", "17" = "#5757FF", "18" = "#00C853", "19" = "#5757FF", "20" = "#00C853", "21" = "#5757FF", "22" = "#00C853", "23" = "#FF4848", "24" = "#5757FF", "25" = "#00C853", "26" = "#FF4848", "27" = "#00C853", "28" = "#5757FF", "29" = "#00C853", "30" = "#5757FF", "31" = "#00C853")) + scale_colour_manual(values = c("black")) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + ylab("VAMP-seq score")+xlab("Position in TPMT")+labs(colour="Secondary Structure")+ggtitle("TPMT scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
pten_hydro1 <- ggplot(pten1_proc_wt, aes(y=score, x=(hydro2-hydro1)))+ geom_point(size=0.5, alpha = 0.3) + ylab("Hydrophobicity")+xlab("VAMP-seq score")+ggtitle("PTEN scores in relation to change in hydrophobicity")
pten_aa_spread <- ggplot(pten1_proc_wt[2:288,], aes(y=score, x=start)) + geom_violin(draw_quantiles=c(0.5))
pten_aa_spread1 <- ggplot(pten1_proc_wt[2:288,], aes(y=score, x=start)) + geom_point(size = 0.5)
plot(pten_pos)

plot(tpmt_pos)

#plot(tpmt_pos_vp)
#plot(pten_hydro)
#plot(pten_hydro1)
#plot(pten_aa_spread)
#plot(pten_aa_spread1)
tpmt_sum <- summarySE(tpmt1_proc_wt, measurevar="score", groupvars="position")
head(tpmt_sum)
tpmt_pos_mean <- ggplot(tpmt_sum, aes(x=factor(position), y=score))+ geom_bar(position=position_dodge(), stat="identity", colour="#999999") + geom_errorbar(aes(ymin=score-sd, ymax = score+sd), width=0.001, position=position_dodge()) +ylab("VAMP-seq score")+theme(axis.title.x = element_blank(), axis.text.x = element_blank()) + scale_x_discrete(breaks = seq(0, 250, 10))
tpmt_heat <- ggplot(tpmt1_proc_wt, aes(factor(position), end)) + geom_tile(aes(fill=score)) + scale_fill_gradientn(colours = c("#3F7CB9", "#FFEAF3", "#B21F4E"), values = scales::rescale(c(-0.7, 0.2, 1, 1.3, 2.03)))+ scale_x_discrete(breaks = seq(0, 250, 10)) + theme(legend.position='bottom')+xlab("Position in TPMT")
#scale_fill_gradient2(low="#3F7CB9", mid="white", high="#B21F4E", midpoint=1) 
#scale_fill_distiller(palette= "RdBu")
tpmt_dssp_schematic <- ggplot() + ggtitle("TPMT mean abundance scores") +
  geom_segment(aes(x = 1, y = 0, xend = max(tpmt1_data$position)), yend = 0, size = 1, color = "grey70") +
  geom_point(data = tpmt1_data, aes(x = position, y = 0), color = "black", size = 1.8) +
  geom_point(data = subset(tpmt1_data, sheet == 1), aes(x = position, y = 0), color = "pink", size = 1.5) +
  geom_point(data = subset(tpmt1_data, helix == 1), aes(x = position, y = 0), color = "cyan", size = 1.5) +
  scale_x_continuous(breaks = seq(0, 250, 10), expand = c(0,0)) +
  scale_y_continuous(breaks = NULL, expand = c(0,0)) +xlab(NULL) + ylab(NULL) +
  theme(panel.border = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank())
tpmt_dssp_schematic

#+ geom_vline(xintercept=185, color="black", size=.1) + geom_vline(xintercept=350, color="black", size=.1)
#grouping all variants in the same secondary structure together
tpmt_aa_sum <- summarySE(tpmt_colors, measurevar="score", groupvars="fact")
tpmt_aa_mean <- ggplot(tpmt_aa_sum, aes(x=fact, y=score))+ geom_bar(position=position_dodge(), stat="identity", colour="#999999") + geom_errorbar(aes(ymin=score-sd, ymax = score+sd), width=0.001, position=position_dodge()) +ylab("VAMP-seq score")+theme(axis.title.x = element_blank(), axis.text.x = element_blank()) + scale_x_discrete(breaks = seq(0, 250, 10))
plot(tpmt_aa_mean)

plot(tpmt_pos_mean)

plot(tpmt_heat)

#method1 (basic, for visualizing in rstudio)
grid.newpage()
grid.draw(rbind(ggplotGrob(tpmt_dssp_schematic), ggplotGrob(tpmt_pos_mean), ggplotGrob(tpmt_heat), size = "last"))
Removed 1 rows containing missing values (geom_segment).Removed 1 rows containing missing values (geom_point).

#method2 (use for final layout, size specification, download)
gA=ggplot_gtable(ggplot_build(tpmt_pos_mean))
gB=ggplot_gtable(ggplot_build(tpmt_heat))
gC=ggplot_gtable(ggplot_build(tpmt_dssp_schematic))
Removed 1 rows containing missing values (geom_segment).Removed 1 rows containing missing values (geom_point).
maxWidth = grid::unit.pmax(gA$widths, gB$widths, gC$widths)
gA$widths <- as.list(maxWidth)
gB$widths <- as.list(maxWidth)
gC$widths <- as.list(maxWidth)
grid.newpage()

#storing, with specified widths!!
#pdf('tpmt_mean_heat1.pdf', width=8, height=6)
#grid.arrange(arrangeGrob(gC,gA,gB,nrow=3,heights=c(.1,.3,.8)))
#dev.off()
tpmt_sum_o <- tpmt_sum[order(tpmt_sum$score),]
tpmt_sum_o$position <- factor(tpmt_sum_o$position, levels=tpmt_sum_o$position[order(tpmt_sum_o$score)])
#head(tpmt_sum_o)
tpmt_pos_mean_o <- ggplot(tpmt_sum_o, aes(x=factor(position), y=score))+ geom_bar(position=position_dodge(), stat="identity", colour="#999999") + geom_errorbar(aes(ymin=score-sd, ymax = score+sd), width=0.001, position=position_dodge()) +ylab("VAMP-seq score")+theme(axis.title.x = element_blank(), axis.text.x = element_blank()) + scale_x_discrete(breaks = seq(0, 250, 10))
aaa <- tpmt1_proc_wt
aaa$means <- tpmt_sum[match(aaa$position, tpmt_sum$position),2]
#aaa$means[aaa$position==tpmt_sum$position] <- tpmt_sum$score
head(aaa)
bbb <- aaa[order(aaa$mean),]
bbb$position <- as.factor(bbb$position)
head(bbb)
tpmt_heat_o <- ggplot(bbb, aes(x=factor(position), y=end)) + geom_tile(aes(fill=score)) + scale_fill_gradientn(colours = c("#3F7CB9", "#FFEAF3", "#B21F4E"), values = scales::rescale(c(-0.7, 0.2, 1, 1.3, 2.03)))+ scale_x_discrete(breaks = seq(0, 250, 10)) + theme(legend.position='bottom')+xlab("Position in TPMT")
aaa$position <- factor(aaa$position, levels=unique(aaa$position)[order(aaa$means)])
#tpmt_heat_o <- ggplot(aaa, aes(x=factor(mean), y=end)) + geom_tile(aes(fill=score)) + scale_fill_gradientn(colours = c("#3F7CB9", "#FFEAF3", "#B21F4E"), values = scales::rescale(c(-0.7, 0.2, 1, 1.3, 2.03)))+ scale_x_discrete(breaks = seq(0, 250, 10)) + theme(legend.position='bottom')+xlab("Position in TPMT")
#scale_fill_gradient2(low="#3F7CB9", mid="white", high="#B21F4E", midpoint=1) 
#scale_fill_distiller(palette= "RdBu")
#tpmt_dssp_schematic <- ggplot() + ggtitle("TPMT mean abundance scores") +
#  geom_segment(aes(x = 1, y = 0, xend = max(tpmt1_data$position)), yend = 0, size = 1, color = "grey70") +
#  geom_point(data = tpmt1_data, aes(x = position, y = 0), color = "black", size = 1.8) +
#  geom_point(data = subset(tpmt1_data, sheet == 1), aes(x = position, y = 0), color = "pink", size = 1.5) +
#  geom_point(data = subset(tpmt1_data, helix == 1), aes(x = position, y = 0), color = "cyan", size = 1.5) +
#  scale_x_continuous(breaks = seq(0, 250, 10), expand = c(0,0)) +
#  scale_y_continuous(breaks = NULL, expand = c(0,0)) +xlab(NULL) + ylab(NULL) +
#  theme(panel.border = element_blank(), axis.text.x = element_blank(), axis.text.y = element_blank())
#tpmt_dssp_schematic
plot(tpmt_pos_mean_o)

plot(tpmt_heat_o)

set.seed(153)
jitter <- position_jitter(width = 1, height = NULL)
jitter1 <-position_jitter(width = 0.08, height = NULL)
jitter2 <- position_jitter(width=0.13, height = NULL)
twenty_color = c("#D02028", "#E1A12F", "#EDD941", "#F2F08E", "#EEC898", "#BCDDAE", "#A4C33B", "#76C158", "#85782E", "#315935", "#53958B", "#A1DAE0", "#486EB6", "#E6A3B4", "#C5A0CA", "#554DA0", "#99247E", "#402059", "#82421B", "#7E807E", 'black')
#pten_k_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=start)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "K"), aes(group=factor(position))) + xlab("Position in PTEN") + ggtitle("Lysine variant abundance scores")
pten_k_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "K"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Lysine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "K"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_k_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "K"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Lysine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "K"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_g_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "G"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Glycine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "G"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_g_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "G"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Glycine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "G"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_g_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "G"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Glycine variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "G"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral")
pten_c_spread <- ggplot(pten1_proc_wt, aes(y=score, x=position)) + geom_point(data=subset(pten1_proc_wt, start== "C")) + xlab("Position in PTEN") + ggtitle("Cysteine variant abundance scores")
#experiment_orig
#pten_c_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=position, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "C"), aes(group=position%%450), scale = "width") + xlab("Position in PTEN") + ggtitle("Cysteine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "C"), aes(x=position, y=score), alpha = 0.75, position=jitter) + scale_color_manual(values=c("#D02028", "#E1A12F", "#EDD941", "#F2F08E", "#EEC898", "#BCDDAE", "#A4C33B", "#76C158", "#85782E", "#315935", "#53958B", "#A1DAE0", "#486EB6", "#E6A3B4", "#C5A0CA", "#554DA0", "#99247E", "#402059", "#82421B", "#7E807E", 'black'))
#, scale = "count"
#+ geom_point(data=subset(pten1_proc_wt, start== "C"), aes(x=position, y=score), alpha = 0.5)
pten_c_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=position, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "C"), aes(group=position%%450), scale = "width") + xlab("Position in PTEN") + ggtitle("Cysteine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "C"), aes(x=position, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_c_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "C"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Cysteine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "C"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_c_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=position, colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "C"), aes(group=position%%450), scale = "width") + xlab("Position in PTEN") + ggtitle("Cysteine variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "C"), aes(x=position, y=score), alpha = 0.75, position=jitter1) + scale_color_distiller(palette = "Spectral")
#in in geom_violin(aes()) -> colour = hydro1
#pten_s_spread <- ggplot(pten1_proc_wt, aes(y=score, x=position)) + geom_point(data=subset(pten1_proc_wt, start== "S")) + xlab("Position in PTEN") + ggtitle("Serine variant abundance scores")
#pten_s_spread1_old <- ggplot(pten1_proc_wt, aes(y=score, x=start)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=factor(position))) + xlab("Position in PTEN") + ggtitle("Serine variant abundance scores")
pten_s_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_s_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_s_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Serine variant abundance scores w/ hydrophobicity change")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_distiller(palette = "Spectral")
#graphing abundance vs change in hydrophobicity
pten_s_hh_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=factor(hydro2-hydro1), colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=factor(hydro2-hydro1)), scale = "width") + xlab("Change in hydrophobicity") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=factor(hydro2-hydro1), y=score), alpha = 0.75, position=jitter1)
#pten_s_aa_hydrodiff <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = (hydro2-hydro1))) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=end, y=score), alpha = 0.75, position=jitter1)
#pten_s_aa_voldiff <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = voldiff)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=end, y=score), alpha = 0.75, position=jitter1)
#pten_s_aa_poldiff <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = polaritydiff)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=end, y=score), alpha = 0.75, position=jitter1)
#pten_s_aa_weightdiff <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = weightdiff)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "S"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Serine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "S"), aes(x=end, y=score), alpha = 0.75, position=jitter1)
#specific amino acid tests
##plot(pten_k_spread)
##plot(pten_g_spread)
##plot(pten_c_spread)
##plot(pten_s_spread)
##plot(pten_s_spread1_old)
plot(pten_s_hydrodiff)

#plot(pten_s_hh_hydrodiff) #probably not very useful... does not take into account position anymore
##plot(pten_s_aa_hydrodiff)
##plot(pten_s_aa_voldiff)
##plot(pten_s_aa_poldiff)
##plot(pten_s_aa_weightdiff)
#plot(pten_c_spread1)
#plot(pten_c_aa)
plot(pten_c_hydrodiff)

plot(pten_s_spread1)

#plot(pten_s_aa)
#plot(pten_g_spread1)
#plot(pten_g_aa)
plot(pten_g_hydrodiff)

#plot(pten_k_spread1)
#plot(pten_k_aa)
pten_a_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_a_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "A"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Alanine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "A"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_r_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_r_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "R"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Arganine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "R"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_n_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_n_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "N"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Asparagine variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "N"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
pten_d_spread1 <- ggplot(pten1_proc_wt, aes(y=score, x=factor(position), colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=factor(position)), scale = "width") + xlab("Position in PTEN") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=factor(position), y=score), alpha = 0.85, position=jitter2) + scale_color_manual(values=twenty_color)
pten_d_aa <- ggplot(pten1_proc_wt, aes(y=score, x=end, colour = end)) + geom_violin(draw_quantiles=c(0.5), data=subset(pten1_proc_wt, start== "D"), aes(group=end), scale = "width") + xlab("Amino acid") + ggtitle("Aspartic Acid variant abundance scores")+ geom_point(data=subset(pten1_proc_wt, start== "D"), aes(x=end, y=score), alpha = 0.75, position=jitter1) + scale_color_manual(values=twenty_color)
plot(pten_a_spread1)

plot(pten_a_aa)

plot(pten_r_spread1)

plot(pten_r_aa)

plot(pten_n_spread1)

plot(pten_n_aa)

plot(pten_d_spread1)

plot(pten_d_aa)

# graph VAMP-seq scores relative to variant position in protein
#pten
pten1_hbond <- pten1_proc[!is.na(pten1_proc$hbond_sum),]
pten1_hbond$secondary_struct <- ifelse(is.na(pten1_hbond$helix), "unknown",
                        ifelse(pten1_hbond$helix==1, "helix",
                        ifelse(pten1_hbond$sheet==1, "sheet",
                        ifelse(pten1_hbond$helix==0, "neither",
                        "unknown"))))
pten_plot_hbond <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score, colour=secondary_struct))+ geom_point(alpha=0.4) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding") + scale_color_manual(values=c("#FF4848", "#696969", "#5757FF")) + labs(colour="Secondary Structure")
plot(pten_plot_hbond)

pten_plot_hbond1 <- ggplot(pten1_hbond, aes(x=hbond_sum, y=score))+ geom_point(alpha = 0.2) + ylab("VAMP-seq score")+xlab("DSSP Sum of hydrogen bonds")+ggtitle("PTEN scores in relation to hydrogen bonding")
# was in aes, ggplot function call ---> colour=secondary_struct
#scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) + labs(colour="Secondary Structure")+
plot(pten_plot_hbond1)

#less hydrogen bonds ~ higher abundance
#store last four
# pdf("position_hydrogen_bonds.pdf")
# plot(pten_pos)
# plot(tpmt_pos)
# plot(pten_plot_hbond)
# plot(pten_plot_hbond1)
# dev.off()
name <- c('Ala', 'Arg', 'Asn', 'Asp', 'Cys', 'Glu', 'Gln', 'Gly', 'His', 'Ile', 'Leu', 'Lys', 'Met', 'Phe', 'Pro', 'Ser', 'Thr', 'Trp', 'Tyr', 'Val')
quality <- c('Hydrophobic', 'Basic', 'Polar Neutral', 'Acidic', 'Polar Neutral', 'Acidic', 'Polar Neutral', 'Glycine', 'Basic', 'Hydrophobic', 'Hydrophobic', 'Basic', 'Hydrophobic', 'Hydrophobic', 'Hydrophobic', 'Polar Neutral', 'Polar Neutral', 'Hydrophobic', 'Hydrophobic', 'Hydrophobic')
#abundance <- get better scale
abundance <- c(0.0884, 0.057, 0.0417, 0.0539, 0.0124, 0.0624, 0.0382, 0.0703, 0.0220, 0.0595, 0.0994, 0.0527, 0.0237, 0.04, 0.0471, 0.0672, 0.0543, 0.0121, 0.03, 0.0677)
#isoelectric point <- unknown source (ncbi)
isoelectric <- c(6, 10.8, 5.4, 3, 5, 3.2, 5.7, 6, 7.6, 6, 6, 9.7, 5.7, 5.5, 6.3, 5.7, 5.6, 5.9, 5.7, 6.0)
hp_k_d <- c(1.8, -4.5, -3.5, -3.5, 2.5, -3.5, -3.5, -0.4, -3.2, 4.5, 3.8, -3.9, 1.9, 2.8, -1.6, -0.8, -0.7, -0.9, -1.3, 4.2)
hp_janin <-c(0.3, -1.4, -0.5, -0.6, 0.9, -0.7, -0.7, 0.3, -0.1, 0.7, 0.5, -1.8, 0.4, 0.5, -0.3, -0.1, -0.2, 0.3, -0.4, 0.6)
#Monera et al., J. Protein Sci (pro (-46) may be sketch)
hp_ph7 <- c(41, -14, -28, -55, 49, -31, -10, 0, 8, 99, 97, -23, 74, 100, -46, -5, 13, 97, 63, 76)
h_bonds <- c(0, 7, 5, 4, 0, 4, 5, 0, 3, 0, 0, 3, 0, 0, 0, 3, 3, 1, 3, 0)
mol_weight <-c(71, 156, 114, 115, 103, 129, 128, 57, 137, 113, 113, 128, 131, 147, 97, 87, 101, 186, 163, 99)
amino_acids.data <- data.frame(name, quality, abundance, isoelectric, hp_k_d, hp_janin, hp_ph7, h_bonds, mol_weight)
img = readImage("/Users/go2alyssa/Desktop/density_plots.png")
display(img, method = "raster")

VAMP-seq abundance score density plots for PTEN (top) and TPMT (bottom) nonsense variants (blue dashed line), synonymous variants (red dashed line) and missense variants (filled, solid line). The missense variant densities are colored as gradients between the lowest 10% of abundance scores (blue), the WT abundance score (white) and abundance scores above WT (red).

#Identifying items in tail to investigate
pten1_nonsense <- subset(pten1_proc, class == "nonsense")
tpmt1_nonsense <- subset(tpmt1_proc, class == "nonsense")
pten1_synon <- subset(pten1_proc, class == "synonymous")
tpmt1_synon <- subset(tpmt1_proc, class == "synonymous")
pten1_no_missense <- subset(pten1_proc, class == "synonymous" | class == "nonsense")
ggplot(pten1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white") 

#+ geom_density()
ggplot(pten1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white")

ggplot(pten1_proc_wt, aes(x=score)) + geom_histogram(data=subset(pten1_proc_wt,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_proc_wt,class == "missense"), fill = "green", alpha = 0.2, binwidth=.01)

ggplot(pten1_no_missense, aes(x=score)) + geom_histogram(data=subset(pten1_no_missense,class == "nonsense"), fill = "red", alpha = 0.5, binwidth=.01) + geom_histogram(data=subset(pten1_no_missense,class == "synonymous"), fill = "blue", alpha = 0.5, binwidth=.01)

ggplot(tpmt1_synon, aes(x=score)) + geom_histogram(binwidth=.01, colour="red", fill="white")

ggplot(tpmt1_nonsense, aes(x=score)) + geom_histogram(binwidth=.01, colour="blue", fill="white")

#0.55
nonsense_tail <- subset(pten1_nonsense, score > 0.6)
synon_tail <- subset(pten1_synon, score < 0.6)
nonsense_tail$secondary_struct <- ifelse(is.na(nonsense_tail$helix), "unknown",
                        ifelse(nonsense_tail$helix==1, "helix",
                        ifelse(nonsense_tail$sheet==1, "sheet",
                        ifelse(nonsense_tail$helix==0, "neither",
                        "unknown"))))
synon_tail$secondary_struct <- ifelse(is.na(synon_tail$helix), "unknown",
                        ifelse(synon_tail$helix==1, "helix",
                        ifelse(synon_tail$sheet==1, "sheet",
                        ifelse(synon_tail$helix==0, "neither",
                        "unknown"))))
#data[row,column]
n_tail <- nonsense_tail[,c(1,2,7,30,127)]
s_tail <- synon_tail[,c(1,2,7,30,127)]
n_tail$bp_pos <- (n_tail$position-1)*3
s_tail$bp_pos <- (s_tail$position-1)*3
n_tail
s_tail
#just in case there is a discernible pattern
s_tail_pos <- ggplot(s_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN synonymous variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
plot(s_tail_pos)

#help visualizing NMD rules
n_tail_pos <- ggplot(n_tail, aes(x=position, y=score, colour=secondary_struct))+ geom_point(size=.3) + scale_x_continuous(minor_breaks = seq(0, 405, 5)) + scale_color_manual(values=c("#FF4848", "#00C853", "#5757FF", "#A9A9A9")) +ylab("VAMP-seq score")+xlab("Position in PTEN")+labs(colour="Secondary Structure")+ggtitle("PTEN nonsense variant tail scores in relation to protein structure") + geom_vline(xintercept=47, color="black", size=.1) + geom_vline(xintercept=78, color="black", size=.1) + geom_vline(xintercept=122.5, color="black", size=.1) + geom_vline(xintercept=140, color="black", size=.1) + geom_vline(xintercept=165, color="black", size=.1) + geom_vline(xintercept=194, color="black", size=.1) + geom_vline(xintercept=209, color="black", size=.1)
plot(n_tail_pos)

s_tail$prob_AG_GT <- c(0, 1/6, 1/2, 0, 1/2, 1/6)
s_tail$prob_titv <- c(0, 2/3, 2/3, 0, 2/3, 1/3)
ggplot(n_tail, aes(x=position,y=score)) + geom_point() + geom_smooth(method = "lm")

ggplot(s_tail, aes(x=prob_titv,y=score)) + geom_point() + geom_smooth(method = "lm")

ggplot(s_tail, aes(y=prob_titv,x=score)) + geom_point() + geom_smooth(method = "lm")

rsq <- function (x, y) cor(x, y)^2
n_rsq <- rsq(n_tail$position, s_tail$score)
s_rsq <- rsq(s_tail$prob_titv, s_tail$score)
n_rsq
[1] 0.462512
s_rsq
[1] 0.02100406
#no relationship...
# pten1_proc_wt$secondary_struct <- ifelse(is.na(pten1_proc_wt$helix), "unknown",
#                         ifelse(pten1_proc_wt$helix==1, "helix",
#                         ifelse(pten1_proc_wt$sheet==1, "sheet",
#                         ifelse(pten1_proc_wt$helix==0, "neither",
#                         "unknown"))))
#start position within pten gene
# n_tail$s_pos <- ifelse((n_tail$bp_pos_cum)>e1, (
#   ifelse((n_tail$bp_pos_cum) > (e1+e2), (
#     ifelse((n_tail$bp_pos_cum) > (e1+e2+e3), (
#       ifelse((n_tail$bp_pos_cum) > (e1+e2+e3), (
#       
#       ), (n_tail$bp_pos_cum+e4_s))
#     ), (n_tail$bp_pos_cum+e3_s))
#   ), (n_tail$bp_pos_cum+e2_s))
# ), (n_tail$bp_pos_cum+e1_s))
#end position within pten gene
#within 2 amino acids of junction
# #e1_s is the first bp of the first exon
# e1_s = 89624227
# #e1_e is the last bp of the first exon, 
# e1_e = 89624305
# #e1 is length in bp
# el = 79
# e2 = 85
# e3 = 45
# e4 = 44
# e5 = 239
# e6 = 142
# e7 = 167
# e8 = 225
# e9 = 186
# e2_s = 89653782
# e2_e = 89653866
# e3_s = 89685270   
# e3_e = 89685314   
# e4_s = 89690803
# e4_e = 89690846
# e5_s = 89692770   
# e5_e = 89693008
# e6_s = 89711875   
# e6_e = 89712016   
# e7_s = 89717610   
# e7_e = 89717776   
# e8_s = 89720651   
# e8_e = 89720875   
# e9_s = 89725044
# e9_e = 89725229
gs_ls()
Auto-refreshing stale OAuth token.
tpmt_ruddle <- gs_title("TPMT_ruddle")
Sheet successfully identified: "TPMT_ruddle"
tpmt_read <- gs_read(ss=tpmt_ruddle, ws = "ruddle_tpmt_variants")
Accessing worksheet titled 'ruddle_tpmt_variants'.

Downloading: 1.3 kB     
Downloading: 1.3 kB     
Downloading: 2.6 kB     
Downloading: 2.6 kB     
Downloading: 4 kB     
Downloading: 4 kB     
Downloading: 4.1 kB     
Downloading: 4.1 kB     
Downloading: 5.3 kB     
Downloading: 5.3 kB     
Downloading: 6.7 kB     
Downloading: 6.7 kB     
Downloading: 8 kB     
Downloading: 8 kB     
Downloading: 9.4 kB     
Downloading: 9.4 kB     
Downloading: 11 kB     
Downloading: 11 kB     
Downloading: 12 kB     
Downloading: 12 kB     
Downloading: 13 kB     
Downloading: 13 kB     
Downloading: 14 kB     
Downloading: 14 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 16 kB     
Downloading: 18 kB     
Downloading: 18 kB     
Downloading: 19 kB     
Downloading: 19 kB     
Downloading: 20 kB     
Downloading: 20 kB     
Downloading: 21 kB     
Downloading: 21 kB     
Downloading: 22 kB     
Downloading: 22 kB     
Downloading: 23 kB     
Downloading: 23 kB     
Downloading: 24 kB     
Downloading: 24 kB     
Downloading: 25 kB     
Downloading: 25 kB     
Downloading: 26 kB     
Downloading: 26 kB     
Downloading: 27 kB     
Downloading: 27 kB     
Downloading: 28 kB     
Downloading: 28 kB     
Downloading: 29 kB     
Downloading: 29 kB     
Downloading: 30 kB     
Downloading: 30 kB     
Downloading: 32 kB     
Downloading: 32 kB     
Downloading: 33 kB     
Downloading: 33 kB     
Downloading: 34 kB     
Downloading: 34 kB     
Downloading: 35 kB     
Downloading: 35 kB     
Downloading: 36 kB     
Downloading: 36 kB     
Downloading: 37 kB     
Downloading: 37 kB     
Downloading: 39 kB     
Downloading: 39 kB     
Downloading: 39 kB     
Downloading: 39 kB     
Downloading: 41 kB     
Downloading: 41 kB     
Downloading: 42 kB     
Downloading: 42 kB     
Downloading: 43 kB     
Downloading: 43 kB     
Downloading: 44 kB     
Downloading: 44 kB     
Downloading: 45 kB     
Downloading: 45 kB     
Downloading: 46 kB     
Downloading: 46 kB     
Downloading: 47 kB     
Downloading: 47 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 49 kB     
Downloading: 50 kB     
Downloading: 50 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 52 kB     
Downloading: 53 kB     
Downloading: 53 kB     
Downloading: 55 kB     
Downloading: 55 kB     
Downloading: 56 kB     
Downloading: 56 kB     
Downloading: 57 kB     
Downloading: 57 kB     
Downloading: 58 kB     
Downloading: 58 kB     
Downloading: 59 kB     
Downloading: 59 kB     
Downloading: 60 kB     
Downloading: 60 kB     
Downloading: 61 kB     
Downloading: 61 kB     
Downloading: 62 kB     
Downloading: 62 kB     
Downloading: 63 kB     
Downloading: 63 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 65 kB     
Downloading: 66 kB     
Downloading: 66 kB     
Downloading: 68 kB     
Downloading: 68 kB     
Downloading: 69 kB     
Downloading: 69 kB     
Downloading: 70 kB     
Downloading: 70 kB     
Downloading: 71 kB     
Downloading: 71 kB     
Downloading: 72 kB     
Downloading: 72 kB     
Downloading: 73 kB     
Downloading: 73 kB     
Downloading: 74 kB     
Downloading: 74 kB     
Downloading: 75 kB     
Downloading: 75 kB     
Downloading: 77 kB     
Downloading: 77 kB     
Downloading: 77 kB     
Downloading: 77 kB     
Downloading: 79 kB     
Downloading: 79 kB     
Downloading: 80 kB     
Downloading: 80 kB     
Downloading: 81 kB     
Downloading: 81 kB     
Downloading: 82 kB     
Downloading: 82 kB     
Downloading: 83 kB     
Downloading: 83 kB     
Downloading: 84 kB     
Downloading: 84 kB     
Downloading: 85 kB     
Downloading: 85 kB     
Downloading: 87 kB     
Downloading: 87 kB     
Downloading: 88 kB     
Downloading: 88 kB     
Downloading: 89 kB     
Downloading: 89 kB     
Downloading: 90 kB     
Downloading: 90 kB     
Downloading: 91 kB     
Downloading: 91 kB     
Downloading: 92 kB     
Downloading: 92 kB     
Downloading: 93 kB     
Downloading: 93 kB     
Downloading: 94 kB     
Downloading: 94 kB     
Downloading: 95 kB     
Downloading: 95 kB     
Downloading: 96 kB     
Downloading: 96 kB     
Downloading: 97 kB     
Downloading: 97 kB     
Downloading: 98 kB     
Downloading: 98 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 100 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 110 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 120 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 130 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 140 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 150 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 160 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 170 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 180 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 190 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 200 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 210 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 220 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 230 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 240 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 250 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 260 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 270 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 280 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 290 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 300 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Downloading: 310 kB     
Parsed with column specification:
cols(
  .default = col_character(),
  chr = col_integer(),
  pos = col_integer(),
  hg18_pos = col_integer(),
  hg38_pos = col_integer(),
  aapos = col_integer(),
  MutationTaster_score = col_double(),
  MutationTaster_converted_rankscore = col_double(),
  `Eigen-raw` = col_double(),
  `Eigen-phred` = col_double(),
  `Eigen-PC-raw` = col_double(),
  `Eigen-PC-phred` = col_double(),
  `Eigen-PC-raw_rankscore` = col_double(),
  CADD_raw = col_double(),
  CADD_raw_rankscore = col_double(),
  CADD_phred = col_double(),
  `GERP++_NR` = col_double(),
  `GERP++_RS` = col_double(),
  `GERP++_RS_rankscore` = col_double(),
  phyloP46way_primate = col_double(),
  phyloP46way_primate_rankscore = col_double()
  # ... with 12 more columns
)
See spec(...) for full column specifications.
tpmt_ruddle_data <- as.data.frame(tpmt_read)
#reversing data to fit tpmt1_data
rever <- function(df=tpmt_ruddle_data){df<-df[dim(df)[1]:1,]}
tpmt_ruddle_data_rev = rever(tpmt_ruddle_data)
#creating variant column, equiv to tpmt1_data's
tpmt_ruddle_data_rev$variant <- do.call(paste, c(tpmt_ruddle_data_rev[c(5,24,6)], sep=""))
#making both tables smaller
tpmt_essential <- tpmt_ruddle_data_rev[,c(2,3,4,5,6,17,19,24,27,28,29,30,31,32,33,34,35,76,77,78,137)]
tpmt1_proc_ess <- tpmt1_proc_wt[,c(1,2,3,5,6,7,30,32,80)]
#merging tables with variant name
tpmt_merge <- merge(tpmt1_proc_ess, tpmt_essential, by="variant")
#comparing abundance scores with various scores in dbNSFP (contains annotations of all potential non-synonymous single-nucleotide variants (nsSNVs) in the human genome)
tpmt_cor1 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(SIFT_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("SIFT score")+ggtitle("1")
tpmt_cor1.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(SIFT_converted_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("SIFT converted rankscore")+ggtitle("1.5")
tpmt_cor5 <- ggplot(tpmt_merge, aes(x=score, y=CADD_raw_rankscore))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("CADD raw rankscore")+ggtitle("5")
tpmt_cor2 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HDIV_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HDIV score")+ggtitle("2")
tpmt_cor3 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HVAR_score)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HVAR score")+ggtitle("3")
tpmt_cor2.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HDIV_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HDIV rankscore")+ggtitle("2.5")
tpmt_cor3.5 <- ggplot(tpmt_merge, aes(x=score, y=as.numeric(Polyphen2_HVAR_rankscore)))+ geom_point(alpha = 0.2) + xlab("VAMP-seq score")+ylab("Polyphen2 HVAR rankscore")+ggtitle("3.5")
#CADD_phred not worth
#plot(tpmt_cor5)
#plot(tpmt_cor1)
#plot(tpmt_cor1.5)
plot(tpmt_cor2)

plot(tpmt_cor3)

plot(tpmt_cor2.5)

plot(tpmt_cor3.5)

TPMT_abun_CADD <- ggplot(tpmt_merge, aes(x=abundance_class, y=CADD_raw_rankscore)) + geom_violin(draw_quantiles = c( 0.5))+ylab("CADD raw rankscore")+xlab("Abundance Class")
plot(TPMT_abun_CADD)

TPMT_abun_SIFT_conv <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(SIFT_converted_rankscore))) + geom_violin(draw_quantiles = c(0.5))+ylab("SIFT conv rankscore")+xlab("Abundance Class")
plot(TPMT_abun_SIFT_conv)

TPMT_abun_POLY <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HDIV_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HDIV rankscore")+xlab("Abundance Class")
plot(TPMT_abun_POLY)

TPMT_abun_POLY1 <- ggplot(tpmt_merge, aes(x=abundance_class, y=as.numeric(Polyphen2_HVAR_rankscore))) + geom_violin(draw_quantiles = c( 0.5))+ylab("Polyphen2 HVAR rankscore")+xlab("Abundance Class")
plot(TPMT_abun_POLY1)

Pred_abun_SIFT <- ggplot(tpmt_merge, aes(abundance_class)) + geom_bar(aes(fill = SIFT_pred)) + ggtitle("Abundance class vs SIFT prediction of Damaging or Tolerated")
plot(Pred_abun_SIFT)

trial_sep <- tpmt_merge[c(21,23,24,26)]
tpmt_merge_expand <- separate_rows(tpmt_merge, c("Polyphen2_HDIV_score", "Polyphen2_HDIV_pred", "Polyphen2_HVAR_score", "Polyphen2_HVAR_pred"))
Pred_abun_HVAR <- ggplot(tpmt_merge_expand, aes(abundance_class)) + geom_bar(aes(fill = Polyphen2_HVAR_pred)) + ggtitle("Abundance class vs Polyphen2 HVAR predictions") + labs(subtitle = "D: Probably Damaging, P: Possibly Damaging, B: Benign")
plot(Pred_abun_HVAR)

LS0tCnRpdGxlOiAiUFRFTiBSIE5vdGVib29rIgpvdXRwdXQ6IGh0bWxfbm90ZWJvb2sKLS0tCmBgYHtyIGdsb2JhbF9vcHRpb25zLCBpbmNsdWRlPUZBTFNFfQpsaWJyYXJ5KGtuaXRyKQpsaWJyYXJ5KGdncGxvdDIpCnJlcXVpcmUoZ3JpZEV4dHJhKQpsaWJyYXJ5KHJlc2hhcGUyKQpsaWJyYXJ5KHByYWNtYSkKbGlicmFyeShnZ2JlZXN3YXJtKQpsaWJyYXJ5KFJtaXNjKQpsaWJyYXJ5KGdyaWQpCmxpYnJhcnkoRUJJbWFnZSkKbGlicmFyeShnb29nbGVzaGVldHMpCmxpYnJhcnkodGlkeXIpCmxpYnJhcnkoZHBseXIpCmtuaXRyOjpvcHRzX2NodW5rJHNldChmaWcud2lkdGg9MTIsIGZpZy5oZWlnaHQ9MTIsIHdhcm5pbmc9RkFMU0UpCmBgYApNdWx0aXBsZXggYXNzZXNzbWVudCBvZiBwcm90ZWluIHZhcmlhbnQgYWJ1bmRhbmNlIGJ5IG1hc3NpdmVseSBwYXJhbGxlbCBzZXF1ZW5jaW5nClZBTVAtc2VxCi0gbXVsdGlwbGV4IGFzc2F5IHRoYXQgdXNlcyBmbHVvcmVzY2VudCByZXBvcnRlcnMgdG8gbWVhc3VyZSB0aGUgc3RlYWR5LXN0YXRlIGFidW5kYW5jZSBvZiBwcm90ZWluIHZhcmlhbnRzIGluIGN1bHR1cmVkIGh1bWFuIGNlbGxzIChlYWNoIGNlbGxleHByZXNzZXMgYSBzaW5nbGUgdmFyaWFudCBkaXJlY3RseSBmdXNlZCB0byBFR0ZQLi4udGhlIHN0YWJpbGl0eSBvZiB0aGUgdmFyaWFudCBkaWN0YXRlcyB0aGUgYWJ1bmRhbmNlIG9mIHRoZSBFR0ZQIGZ1c2lvbiBhbmQsIGFjY29yZGluZ2x5LCB0aGUgZ3JlZW4gZmx1b3Jlc2NlbmNlIHNpZ25hbCBvZiB0aGUgY2VsbCkKLSB1c2VkIHRvIGFzc2VzcyBQVEVOIGFuZCBUUE1UIHZhcmlhbnRzIApgYGB7cn0KcGFyKHBjaD0yMCwgY2V4PS42KQpwdGVuMV9kYXRhIDwtIHJlYWQuZGVsaW0oJ34vbGVrbGFiL2xla2xhYi9wdGVuMS50eHQnKQpwdGVuMV9wcm9jIDwtIHB0ZW4xX2RhdGFbIWlzLm5hKHB0ZW4xX2RhdGEkYWJ1bmRhbmNlX2NsYXNzKSxdCmRkIDwtIGRhdGEuZnJhbWUocHRlbjFfcHJvYyRhYnVuZGFuY2VfY2xhc3MscHRlbjFfcHJvYyRzY29yZSkKY29sbmFtZXMoZGQpIDwtIGMoImFidW5kYW5jZV9jbGFzcyIsICJzY29yZSIpCnRwbXQxX2RhdGEgPC0gcmVhZC5kZWxpbSgnfi9sZWtsYWIvbGVrbGFiL3RwbXRfc3VwcGxfMi50eHQnKQp0cG10MV9wcm9jIDwtIHRwbXQxX2RhdGFbIWlzLm5hKHRwbXQxX2RhdGEkYWJ1bmRhbmNlX2NsYXNzKSxdCmVlIDwtIGRhdGEuZnJhbWUodHBtdDFfcHJvYyRhYnVuZGFuY2VfY2xhc3MsdHBtdDFfcHJvYyRzY29yZSkKY29sbmFtZXMoZWUpIDwtIGMoImFidW5kYW5jZV9jbGFzcyIsICJzY29yZSIpCmRkJHByb3RlaW4gPC0gcmVwKCJQVEVOIiwgbnJvdyhkZCkpCmVlJHByb3RlaW4gPC0gcmVwKCJUUE1UIiwgbnJvdyhlZSkpCmZmID0gZGF0YS5mcmFtZShyYmluZChkZCwgZWUpKQpiYnBwID0gYm94cGxvdChzY29yZX5wcm90ZWluK2FidW5kYW5jZV9jbGFzcywgZGF0YSA9IGZmLCBhdCA9IGMoMSwgMS44LCAzLCAzLjgsIDUsIDUuOCwgNy4yLCA4KSwgeGF4dD0nbicsIGNvbCA9IGMoJ3doaXRlJywgJ2dyYXknKSkKYXhpcyhzaWRlPTEsIGF0PWMoMS40LCAzLjQsIDUuNCwgNy42KSwgbGFiZWxzPWMoJ2xvdycsICdwb3NzaWJseSBsb3cnLCAncG9zc2libHlcbiB3dC1saWtlJywgJ3d0LWxpa2UnKSkKdGl0bGUoJ1ZBTVAtc2VxIHNjb3JlcyBvZiBQVEVOIGFuZCBUUE1UIFZhcmlhbnRzXG5hbmQgYWJ1bmRhbmNlIGNsYXNzJykKCgojcGxvdCh4ID0gcHRlbjFfcHJvYyRhYnVuZGFuY2VfY2xhc3MsIHkgPSBwdGVuMV9wcm9jJHNjb3JlLHR5cGU9J3AnLCBtYWluID0gIlBURU4iLCB4bGFiID0gIkFidW5kYW5jZSIsIHlsYWIgPSAiVkFNUC1zZXEgc2NvcmUiLCBjb2w9IiM3NEFCRDYiKQojcG9pbnRzKHggPSB0cG10MV9wcm9jJGFidW5kYW5jZV9jbGFzcywgeSA9IHRwbXQxX3Byb2Mkc2NvcmUsIHR5cGU9J3AnLCBjb2wgPSAiI0FEREZBRCIpCmBgYApgYGB7cn0KCiMgZCA8LSByZWFkLnRhYmxlKHRleHQgPSAiY29sX2EgY29sX2IgCiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMQojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBiYSAgICAxCiMgICAgICAgICAgICAgICAgICAgICAgICAgYmEgICAgMS4yNQojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuMwojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS43CiMgICAgICAgICAgICAgICAgICAgICAgICAgY2EgICAgMS4yNQojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuMgojICAgICAgICAgICAgICAgICAgICAgICAgIGRhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjQKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjI1CiMgICAgICAgICAgICAgICAgICAgICAgICAgY2EgICAgMS4xCiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS4yNSIsIAojICAgICAgICAgICAgICAgICBoZWFkZXIgPSBUUlVFLCkKIyBlIDwtIHJlYWQudGFibGUodGV4dCA9ICJjb2xfYSBjb2xfYiAKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjYKIyAgICAgICAgICAgICAgICAgICAgICAgICBhYSAgICAxLjU1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYmEgICAgMS4yCiMgICAgICAgICAgICAgICAgICAgICAgICAgYmEgICAgMS40NQojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuOAojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuNTUKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjM1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS45CiMgICAgICAgICAgICAgICAgICAgICAgICAgY2EgICAgMS43NQojICAgICAgICAgICAgICAgICAgICAgICAgIGJhICAgIDEuMjUKIyAgICAgICAgICAgICAgICAgICAgICAgICBkYSAgICAxLjU1CiMgICAgICAgICAgICAgICAgICAgICAgICAgYWEgICAgMS40NQojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuNQojICAgICAgICAgICAgICAgICAgICAgICAgIGNhICAgIDEuMwojICAgICAgICAgICAgICAgICAgICAgICAgIGFhICAgIDEuNzUiLCAKIyAgICAgICAgICAgICAgICAgaGVhZGVyID0gVFJVRSwpCiMgZCRsYWJlbCA8LSByZXAoMSwgbnJvdyhkKSkKIyBlJGxhYmVsIDwtIHJlcCgyLCBucm93KGUpKQojIGYgPSBkYXRhLmZyYW1lKHJiaW5kKGQsIGUpKQojICMjZiRjb2xfYSA9IHBvbGx1dGFudAojICMjZiRsYWJlbCA9IGxvY2F0aW9uCiMgYnAgPSBib3hwbG90KGNvbF9ifmxhYmVsK2NvbF9hLCBkYXRhID0gZiwgYXQgPSBjKDEsIDEuOCwgMywgMy44LCA1LCA1LjgsIDcuMiwgOCksIHhheHQ9J24nLCB5bGltID0gYyguOSwgMS45KSwgY29sID0gYygnd2hpdGUnLCAnZ3JheScpKQojIGF4aXMoc2lkZT0xLCBhdD1jKDEuNCwgMy40LCA1LjQsIDcuNiksIGxhYmVscz1jKCdhYScsICdiYScsICdjYScsICdkYScpLCB0aXRsZSgncHJhY3RpY2UnKSkKYGBgCgoKYGBge3J9CiNwbG90cyBWQU1QLXNlcSBzY29yZSB2cyBhYnVuZGFuY2VfY2xhc3MKCgpWQU1QX2FidW5kYW5jZSA8LSBnZ3Bsb3QoZmYsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1zY29yZSwgZmlsbD1wcm90ZWluKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcyA9IDAuNSkreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKSt0aGVtZShsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBwYW5lbC5ncmlkLm1ham9yID0gZWxlbWVudF9saW5lKGNvbG91ciA9ICJncmV5IiksIHBhbmVsLmdyaWQubWlub3IgPSBlbGVtZW50X2xpbmUoY29sb3VyID0gImdyZXkiKSkrZ2d0aXRsZSgiVkFNUC1zZXEgc2NvcmVzIGZvciBlYWNoIGFidW5kYW5jZSBjbGFzc2lmaWNhdGlvbiIpK2dlb21fcG9pbnQoZGF0YT1kYXRhLmZyYW1lKHg9Ind0LWxpa2UiLCB5PTEsIHByb3RlaW4gPSAiUFRFTiIpLCBhZXMoeCx5KSwgY29sb3VyPSJibGFjayIsIHNpemU9MS41LCBzaG93LmxlZ2VuZD1GQUxTRSkrYW5ub3RhdGUoInRleHQiLCB4ID0gInd0LWxpa2UiLCB5PTEuMDksIGxhYmVsID0gIldUIixjb2xvdXI9ICJibGFjayIsIHNpemUgPSA0KSArIHNjYWxlX3lfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoLTIsIDIsIC4yNSkpCnBsb3QoVkFNUF9hYnVuZGFuY2UpCmBgYApgYGB7cn0KI3Bsb3RzIGhlbGl4IHZzIHNjb3JlIGZvciBQVEVOCmdncGxvdChwdGVuMV9kYXRhLCBhZXMoeD1hcy5mYWN0b3IoaGVsaXgpLCB5PXNjb3JlKSkgKyBnZW9tX2JveHBsb3QoKSt5bGFiKCJWQU1QLXNlcSBzY29yZSIpCmBgYApgYGB7cn0KI2NvbWJpbmluZyBwdGVuMV9kYXRhIGFuZCB0cG10MV9kYXRhIGludG8gb25lIGxhcmdlIGRhdGEgZnJhbWUsIGRpZmZlcmVudGlhdGUgYmV0d2VlbiB0aGUgdHdvIHcvIGNvbHVtbiAncHJvdGVpbicgd2hpY2ggc3BlY2lmaWVzICdQVEVOJyBvciAnVFBNVCcKcHRlbjFfZGF0YSRwcm90ZWluIDwtIHJlcCgiUFRFTiIsIG5yb3cocHRlbjFfZGF0YSkpCnRwbXQxX2RhdGEkcHJvdGVpbiA8LSByZXAoIlRQTVQiLCBucm93KHRwbXQxX2RhdGEpKQpjb21tb25fY29scyA8LSBpbnRlcnNlY3QoY29sbmFtZXMocHRlbjFfZGF0YSksIGNvbG5hbWVzKHRwbXQxX2RhdGEpKQpjb21iX2RhdGEgPSByYmluZChzdWJzZXQocHRlbjFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpLCBzdWJzZXQodHBtdDFfZGF0YSwgc2VsZWN0ID0gY29tbW9uX2NvbHMpKQoKI3Bsb3RzIGhlbGl4IHZzIHNjb3JlIGZvciBQVEVOIGFuZCBUUE1UIHNpZGUgYnkgc2lkZQojbm8gTkEKCmNvbWJfZGF0YV9oZWxpeCA8LSBjb21iX2RhdGFbIWlzLm5hKGNvbWJfZGF0YSRoZWxpeCksXQojY2hlY2sgdG8gc2VlIHdoZXJlIDM3NTkgcm93cyB3ZW50IG9mZiB0bwpjayA8LSBjb21iX2RhdGFfaGVsaXhbIWlzLm5hKGNvbWJfZGF0YV9oZWxpeCRhYnVuZGFuY2VfY2xhc3MpLF0KY29tYl9kYXRhX3NoZWV0IDwtIGNvbWJfZGF0YVshaXMubmEoY29tYl9kYXRhJHNoZWV0KSxdCmNrMSA8LSBjb21iX2RhdGFfc2hlZXRbIWlzLm5hKGNvbWJfZGF0YV9zaGVldCRhYnVuZGFuY2VfY2xhc3MpLF0KCmhfcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0xKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSkpICsgZ3VpZGVzKGZpbGw9RkFMU0UpICsgeGxhYigiQWxwaGEgSGVsaXgiKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikgKyB0aGVtZShheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKQoKc19wbG90IDwtIGdncGxvdChjazEsIGFlcyh4PWFzLmZhY3RvcihzaGVldCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2sxLCBzaGVldD09MSksIGRyYXdfcXVhbnRpbGVzID0gYygwLjUpKSArICB0aGVtZShheGlzLnRpdGxlLnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC55ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyB4bGFiKCJCZXRhIFNoZWV0IikgKyBzY2FsZV95X2NvbnRpbnVvdXMobGltaXRzID0gYygtLjcsIDIuMDMpKSArIGd1aWRlcyhmaWxsPUZBTFNFKSAKCm5fcGxvdCA8LSBnZ3Bsb3QoY2ssIGFlcyh4PWFzLmZhY3RvcihoZWxpeCksIHk9c2NvcmUsIGZpbGw9cHJvdGVpbikpICsgZ2VvbV92aW9saW4oZGF0YT1zdWJzZXQoY2ssIGhlbGl4PT0wICYgc2hlZXQ9PTApLCBkcmF3X3F1YW50aWxlcyA9IGMoIDAuNSkpICsgdGhlbWUoIGF4aXMudGl0bGUueSA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBsZWdlbmQuanVzdGlmaWNhdGlvbj1jKDEsMCksIGxlZ2VuZC5wb3NpdGlvbj1jKC40OSwuNzUpLCBsZWdlbmQudGl0bGU9ZWxlbWVudF9ibGFuaygpLCBsZWdlbmQudGV4dCA9IGVsZW1lbnRfdGV4dChzaXplPTEwKSkgKyB4bGFiKCJPdGhlciIpICsgc2NhbGVfeV9jb250aW51b3VzKGxpbWl0cyA9IGMoLS43LCAyLjAzKSkKCiNwdXQgdGhlIHBsb3RzIHNpZGUgYnkgc2lkZQpjb21iaW5lZCA8LSBncmlkLmFycmFuZ2UoaF9wbG90LCBzX3Bsb3QsIG5fcGxvdCwgbmNvbD0zLCB0b3AgPSAiVmFyaWFudCBzY29yZXMgaW4gcmVsYXRpb24gdG8gcG9zaXRpb24gaW4gcHJvdGVpbiIpCiMjIyMjIyMjIyMjIyMjCiMjc2F2ZSBhcyBwZGYKCiMgcGRmKCJ2aW9saW5fVmFyaWFudF9zY29yZXNfdnMucGRmIikKIyBwbG90KGNvbWJpbmVkKQojIHBsb3QoVkFNUF9hYnVuZGFuY2UpCiMgZGV2Lm9mZigpCiMjIyMjIyMjIyMjIyMjCiN3b3JrcyB0byBzYXZlIHNpbmdsZQojZ2dzYXZlKCJWYXJpYW50X3Njb3Jlc19wcm90ZWluX3Bvc2l0aW9uLnBkZiIsIHBsb3QgPSBjb21iaW5lZCwgZGV2aWNlID0gInBkZiIsIHBhdGggPSAiL1VzZXJzL2dvMmFseXNzYS9EZXNrdG9wLyIsIHNjYWxlID0gMi42LCBkcGkgPSAicmV0aW5hIikKCmBgYAoKYGBge3J9CgojIGdyYXBoIFZBTVAtc2VxIHNjb3JlcyByZWxhdGl2ZSB0byB2YXJpYW50IHBvc2l0aW9uIGluIHByb3RlaW4KI3B0ZW4KcHRlbjFfcHJvY193dCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJHBvc2l0aW9uKSxdCnB0ZW4xX3Byb2Nfd3Qkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEocHRlbjFfcHJvY193dCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX3Byb2Nfd3QkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfcHJvY193dCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnB0ZW5fcG9zIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDIwLCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gcHJvdGVpbiBzdHJ1Y3R1cmUiKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yNywgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NTUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTcwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD04NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTY0LjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTIxMiwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjY3LjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTM0My41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKcHRlbl9oeWRybyA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj0oaHlkcm8yLWh5ZHJvMSkpKSsgZ2VvbV9wb2ludChzaXplPS4zLCBhbHBoYSA9IDAuMykgKyBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKDAsIDQyMCwgNSkpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikrbGFicyhjb2xvdXI9Ikh5ZHJvcGhvYmljaXR5IikrZ2d0aXRsZSgiUFRFTiBzY29yZXMgaW4gcmVsYXRpb24gdG8gY2hhbmdlIGluIGh5ZHJvcGhvYmljaXR5IikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTU1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD03MCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9ODUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE2NC41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0yMTIsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTI2Ny41LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0zNDMuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKCgojdHBtdAp0cG10MV9wcm9jX3d0IDwtIHRwbXQxX3Byb2NbIWlzLm5hKHRwbXQxX3Byb2MkcG9zaXRpb24pLF0KdHBtdDFfcHJvY193dCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYSh0cG10MV9wcm9jX3d0JGhlbGl4KSwgInVua25vd24iLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UodHBtdDFfcHJvY193dCRoZWxpeD09MSwgImhlbGl4IiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHRwbXQxX3Byb2Nfd3Qkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZSh0cG10MV9wcm9jX3d0JGhlbGl4PT0wLCAibmVpdGhlciIsCiAgICAgICAgICAgICAgICAgICAgICAgICJ1bmtub3duIikpKSkKdHBtdF9wb3MgPC0gZ2dwbG90KHRwbXQxX3Byb2Nfd3QsIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlLCBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdCkpKyBnZW9tX3BvaW50KHNpemU9LjMpICsgc2NhbGVfeF9jb250aW51b3VzKG1pbm9yX2JyZWFrcyA9IHNlcSgwLCA0MDUsIDUpKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjMDBDODUzIiwgIiM1NzU3RkYiLCAiI0E5QTlBOSIpKSAreWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikrbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKStnZ3RpdGxlKCJUUE1UIHNjb3JlcyBpbiByZWxhdGlvbiB0byBwcm90ZWluIHN0cnVjdHVyZSIpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTQ3LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD03OCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTIyLjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE0MCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTY1LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xOTQsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTIwOSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkKCnRwbXRfY29sb3JzIDwtIHRwbXQxX3Byb2Nfd3QKI1tvcmRlcihwb3NpdGlvbiwgdmFyaWFudCksXQp0cG10X2NvbG9ycyRmYWN0IDwtIHJlcCgxMCwgbnJvdyh0cG10X2NvbG9ycykpCnRlbXAgPC0gMQpmb3IoaSBpbiAxOihsZW5ndGgodHBtdF9jb2xvcnMkZmFjdCktMSkpIHsKICBpZiAodHBtdF9jb2xvcnMkc2Vjb25kYXJ5X3N0cnVjdFtpXSAhPSB0cG10X2NvbG9ycyRzZWNvbmRhcnlfc3RydWN0W2krMV0pIHsKICAgIHRwbXRfY29sb3JzJGZhY3RbaV0gPC0gdGVtcAogICAgdGVtcCA8LSB0ZW1wICsgMQogIH0gZWxzZSB7CiAgdHBtdF9jb2xvcnMkZmFjdFtpXSA8LSB0ZW1wCiAgfQp9CnRwbXRfY29sb3JzJGZhY3RbbGVuZ3RoKHRwbXRfY29sb3JzJGZhY3QpXSA8LSB0ZW1wCgojIGNjIDwtIDAKIyBmb3IoaSBpbiAxOihsZW5ndGgodHBtdF9jb2xvcnMkZmFjdCktMSkpIHsKIyAgIGlmICh0cG10X2NvbG9ycyRmYWN0W2ldICE9IHRwbXRfY29sb3JzJGZhY3RbaSsxXSkgewojICAgICBwcmludChjYykKIyAgICAgY2MgPC0gMAojICAgfSBlbHNlIHsKIyAgICAgY2MgPC0gY2MgKyAxCiMgICB9CiMgfQoKdHBtdF9wb3NfdnAgPC0gZ2dwbG90KHRwbXRfY29sb3JzLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSkpKyBnZW9tX3Zpb2xpbihkYXRhPXRwbXRfY29sb3JzW2MoMToyNzgzLCAyNzk4OjQwMDApLF0sIGFlcyhmaWxsPWFzLmNoYXJhY3RlcihmYWN0KSwgY29sb3VyID0gZmFjdG9yKFRSVUUpKSwgZHJhd19xdWFudGlsZXMgPSBjKDAuNSksIHNjYWxlID0gIndpZHRoIikgKyAKc2NhbGVfZmlsbF9tYW51YWwodmFsdWVzPWMoIjEiID0gIiNBOUE5QTkiLCAiMiIgPSAiIzAwQzg1MyIsICIzIiA9ICIjRkY0ODQ4IiwgIjQiID0gIiMwMEM4NTMiLCI1IiA9ICIjRkY0ODQ4IiwgIjYiID0gIiMwMEM4NTMiLCI3IiA9ICIjNTc1N0ZGIiwgIjgiID0gIiMwMEM4NTMiLCI5IiA9ICIjRkY0ODQ4IiwiMTAiID0gIiMwMEM4NTMiLCIxMSIgPSAiIzU3NTdGRiIsICIxMiIgPSAiIzAwQzg1MyIsIjEzIiA9ICIjRkY0ODQ4IiwgIjE0IiA9ICIjMDBDODUzIiwgIjE1IiA9ICIjNTc1N0ZGIiwgIjE2IiA9ICIjMDBDODUzIiwgIjE3IiA9ICIjNTc1N0ZGIiwgIjE4IiA9ICIjMDBDODUzIiwgIjE5IiA9ICIjNTc1N0ZGIiwgIjIwIiA9ICIjMDBDODUzIiwgIjIxIiA9ICIjNTc1N0ZGIiwgIjIyIiA9ICIjMDBDODUzIiwgIjIzIiA9ICIjRkY0ODQ4IiwgIjI0IiA9ICIjNTc1N0ZGIiwgIjI1IiA9ICIjMDBDODUzIiwgIjI2IiA9ICIjRkY0ODQ4IiwgIjI3IiA9ICIjMDBDODUzIiwgIjI4IiA9ICIjNTc1N0ZGIiwgIjI5IiA9ICIjMDBDODUzIiwgIjMwIiA9ICIjNTc1N0ZGIiwgIjMxIiA9ICIjMDBDODUzIikpICsgc2NhbGVfY29sb3VyX21hbnVhbCh2YWx1ZXMgPSBjKCJibGFjayIpKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyB5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlRQTVQgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKCnB0ZW5faHlkcm8xIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD0oaHlkcm8yLWh5ZHJvMSkpKSsgZ2VvbV9wb2ludChzaXplPTAuNSwgYWxwaGEgPSAwLjMpICsgeWxhYigiSHlkcm9waG9iaWNpdHkiKSt4bGFiKCJWQU1QLXNlcSBzY29yZSIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eSIpCgpwdGVuX2FhX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dFsyOjI4OCxdLCBhZXMoeT1zY29yZSwgeD1zdGFydCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpKQpwdGVuX2FhX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3RbMjoyODgsXSwgYWVzKHk9c2NvcmUsIHg9c3RhcnQpKSArIGdlb21fcG9pbnQoc2l6ZSA9IDAuNSkKCgpwbG90KHB0ZW5fcG9zKQpwbG90KHRwbXRfcG9zKQoKI3Bsb3QodHBtdF9wb3NfdnApCiNwbG90KHB0ZW5faHlkcm8pCiNwbG90KHB0ZW5faHlkcm8xKQojcGxvdChwdGVuX2FhX3NwcmVhZCkKI3Bsb3QocHRlbl9hYV9zcHJlYWQxKQpgYGAKCmBgYHtyfQoKdHBtdF9zdW0gPC0gc3VtbWFyeVNFKHRwbXQxX3Byb2Nfd3QsIG1lYXN1cmV2YXI9InNjb3JlIiwgZ3JvdXB2YXJzPSJwb3NpdGlvbiIpCmhlYWQodHBtdF9zdW0pCnRwbXRfcG9zX21lYW4gPC0gZ2dwbG90KHRwbXRfc3VtLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0wLjAwMSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkKdHBtdF9oZWF0IDwtIGdncGxvdCh0cG10MV9wcm9jX3d0LCBhZXMoZmFjdG9yKHBvc2l0aW9uKSwgZW5kKSkgKyBnZW9tX3RpbGUoYWVzKGZpbGw9c2NvcmUpKSArIHNjYWxlX2ZpbGxfZ3JhZGllbnRuKGNvbG91cnMgPSBjKCIjM0Y3Q0I5IiwgIiNGRkVBRjMiLCAiI0IyMUY0RSIpLCB2YWx1ZXMgPSBzY2FsZXM6OnJlc2NhbGUoYygtMC43LCAwLjIsIDEsIDEuMywgMi4wMykpKSsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCwgMjUwLCAxMCkpICsgdGhlbWUobGVnZW5kLnBvc2l0aW9uPSdib3R0b20nKSt4bGFiKCJQb3NpdGlvbiBpbiBUUE1UIikKI3NjYWxlX2ZpbGxfZ3JhZGllbnQyKGxvdz0iIzNGN0NCOSIsIG1pZD0id2hpdGUiLCBoaWdoPSIjQjIxRjRFIiwgbWlkcG9pbnQ9MSkgCiNzY2FsZV9maWxsX2Rpc3RpbGxlcihwYWxldHRlPSAiUmRCdSIpCnRwbXRfZHNzcF9zY2hlbWF0aWMgPC0gZ2dwbG90KCkgKyBnZ3RpdGxlKCJUUE1UIG1lYW4gYWJ1bmRhbmNlIHNjb3JlcyIpICsKICBnZW9tX3NlZ21lbnQoYWVzKHggPSAxLCB5ID0gMCwgeGVuZCA9IG1heCh0cG10MV9kYXRhJHBvc2l0aW9uKSksIHllbmQgPSAwLCBzaXplID0gMSwgY29sb3IgPSAiZ3JleTcwIikgKwogIGdlb21fcG9pbnQoZGF0YSA9IHRwbXQxX2RhdGEsIGFlcyh4ID0gcG9zaXRpb24sIHkgPSAwKSwgY29sb3IgPSAiYmxhY2siLCBzaXplID0gMS44KSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIHNoZWV0ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gInBpbmsiLCBzaXplID0gMS41KSArCiAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIGhlbGl4ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gImN5YW4iLCBzaXplID0gMS41KSArCiAgc2NhbGVfeF9jb250aW51b3VzKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSwgZXhwYW5kID0gYygwLDApKSArCiAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwwKSkgK3hsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsKICB0aGVtZShwYW5lbC5ib3JkZXIgPSBlbGVtZW50X2JsYW5rKCksIGF4aXMudGV4dC54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueSA9IGVsZW1lbnRfYmxhbmsoKSkKdHBtdF9kc3NwX3NjaGVtYXRpYwoKIysgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE4NSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MzUwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQoKI2dyb3VwaW5nIGFsbCB2YXJpYW50cyBpbiB0aGUgc2FtZSBzZWNvbmRhcnkgc3RydWN0dXJlIHRvZ2V0aGVyCnRwbXRfYWFfc3VtIDwtIHN1bW1hcnlTRSh0cG10X2NvbG9ycywgbWVhc3VyZXZhcj0ic2NvcmUiLCBncm91cHZhcnM9ImZhY3QiKQp0cG10X2FhX21lYW4gPC0gZ2dwbG90KHRwbXRfYWFfc3VtLCBhZXMoeD1mYWN0LCB5PXNjb3JlKSkrIGdlb21fYmFyKHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCksIHN0YXQ9ImlkZW50aXR5IiwgY29sb3VyPSIjOTk5OTk5IikgKyBnZW9tX2Vycm9yYmFyKGFlcyh5bWluPXNjb3JlLXNkLCB5bWF4ID0gc2NvcmUrc2QpLCB3aWR0aD0wLjAwMSwgcG9zaXRpb249cG9zaXRpb25fZG9kZ2UoKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikrdGhlbWUoYXhpcy50aXRsZS54ID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSkgKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkKcGxvdCh0cG10X2FhX21lYW4pCgpwbG90KHRwbXRfcG9zX21lYW4pCnBsb3QodHBtdF9oZWF0KQoKI21ldGhvZDEgKGJhc2ljLCBmb3IgdmlzdWFsaXppbmcgaW4gcnN0dWRpbykKZ3JpZC5uZXdwYWdlKCkKZ3JpZC5kcmF3KHJiaW5kKGdncGxvdEdyb2IodHBtdF9kc3NwX3NjaGVtYXRpYyksIGdncGxvdEdyb2IodHBtdF9wb3NfbWVhbiksIGdncGxvdEdyb2IodHBtdF9oZWF0KSwgc2l6ZSA9ICJsYXN0IikpCgojbWV0aG9kMiAodXNlIGZvciBmaW5hbCBsYXlvdXQsIHNpemUgc3BlY2lmaWNhdGlvbiwgZG93bmxvYWQpCmdBPWdncGxvdF9ndGFibGUoZ2dwbG90X2J1aWxkKHRwbXRfcG9zX21lYW4pKQpnQj1nZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZCh0cG10X2hlYXQpKQpnQz1nZ3Bsb3RfZ3RhYmxlKGdncGxvdF9idWlsZCh0cG10X2Rzc3Bfc2NoZW1hdGljKSkKbWF4V2lkdGggPSBncmlkOjp1bml0LnBtYXgoZ0Ekd2lkdGhzLCBnQiR3aWR0aHMsIGdDJHdpZHRocykKZ0Ekd2lkdGhzIDwtIGFzLmxpc3QobWF4V2lkdGgpCmdCJHdpZHRocyA8LSBhcy5saXN0KG1heFdpZHRoKQpnQyR3aWR0aHMgPC0gYXMubGlzdChtYXhXaWR0aCkKZ3JpZC5uZXdwYWdlKCkKCiNzdG9yaW5nLCB3aXRoIHNwZWNpZmllZCB3aWR0aHMhIQojcGRmKCd0cG10X21lYW5faGVhdDEucGRmJywgd2lkdGg9OCwgaGVpZ2h0PTYpCiNncmlkLmFycmFuZ2UoYXJyYW5nZUdyb2IoZ0MsZ0EsZ0IsbnJvdz0zLGhlaWdodHM9YyguMSwuMywuOCkpKQojZGV2Lm9mZigpCmBgYApgYGB7cn0KdHBtdF9zdW1fbyA8LSB0cG10X3N1bVtvcmRlcih0cG10X3N1bSRzY29yZSksXQp0cG10X3N1bV9vJHBvc2l0aW9uIDwtIGZhY3Rvcih0cG10X3N1bV9vJHBvc2l0aW9uLCBsZXZlbHM9dHBtdF9zdW1fbyRwb3NpdGlvbltvcmRlcih0cG10X3N1bV9vJHNjb3JlKV0pCiNoZWFkKHRwbXRfc3VtX28pCnRwbXRfcG9zX21lYW5fbyA8LSBnZ3Bsb3QodHBtdF9zdW1fbywgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSkpKyBnZW9tX2Jhcihwb3NpdGlvbj1wb3NpdGlvbl9kb2RnZSgpLCBzdGF0PSJpZGVudGl0eSIsIGNvbG91cj0iIzk5OTk5OSIpICsgZ2VvbV9lcnJvcmJhcihhZXMoeW1pbj1zY29yZS1zZCwgeW1heCA9IHNjb3JlK3NkKSwgd2lkdGg9MC4wMDEsIHBvc2l0aW9uPXBvc2l0aW9uX2RvZGdlKCkpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3RoZW1lKGF4aXMudGl0bGUueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnggPSBlbGVtZW50X2JsYW5rKCkpICsgc2NhbGVfeF9kaXNjcmV0ZShicmVha3MgPSBzZXEoMCwgMjUwLCAxMCkpCmFhYSA8LSB0cG10MV9wcm9jX3d0CmFhYSRtZWFucyA8LSB0cG10X3N1bVttYXRjaChhYWEkcG9zaXRpb24sIHRwbXRfc3VtJHBvc2l0aW9uKSwyXQojYWFhJG1lYW5zW2FhYSRwb3NpdGlvbj09dHBtdF9zdW0kcG9zaXRpb25dIDwtIHRwbXRfc3VtJHNjb3JlCmhlYWQoYWFhKQpiYmIgPC0gYWFhW29yZGVyKGFhYSRtZWFuKSxdCmJiYiRwb3NpdGlvbiA8LSBhcy5mYWN0b3IoYmJiJHBvc2l0aW9uKQpoZWFkKGJiYikKdHBtdF9oZWF0X28gPC0gZ2dwbG90KGJiYiwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1lbmQpKSArIGdlb21fdGlsZShhZXMoZmlsbD1zY29yZSkpICsgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGMoIiMzRjdDQjkiLCAiI0ZGRUFGMyIsICIjQjIxRjRFIiksIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKC0wLjcsIDAuMiwgMSwgMS4zLCAyLjAzKSkpKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249J2JvdHRvbScpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKQoKYWFhJHBvc2l0aW9uIDwtIGZhY3RvcihhYWEkcG9zaXRpb24sIGxldmVscz11bmlxdWUoYWFhJHBvc2l0aW9uKVtvcmRlcihhYWEkbWVhbnMpXSkKI3RwbXRfaGVhdF9vIDwtIGdncGxvdChhYWEsIGFlcyh4PWZhY3RvcihtZWFuKSwgeT1lbmQpKSArIGdlb21fdGlsZShhZXMoZmlsbD1zY29yZSkpICsgc2NhbGVfZmlsbF9ncmFkaWVudG4oY29sb3VycyA9IGMoIiMzRjdDQjkiLCAiI0ZGRUFGMyIsICIjQjIxRjRFIiksIHZhbHVlcyA9IHNjYWxlczo6cmVzY2FsZShjKC0wLjcsIDAuMiwgMSwgMS4zLCAyLjAzKSkpKyBzY2FsZV94X2Rpc2NyZXRlKGJyZWFrcyA9IHNlcSgwLCAyNTAsIDEwKSkgKyB0aGVtZShsZWdlbmQucG9zaXRpb249J2JvdHRvbScpK3hsYWIoIlBvc2l0aW9uIGluIFRQTVQiKQojc2NhbGVfZmlsbF9ncmFkaWVudDIobG93PSIjM0Y3Q0I5IiwgbWlkPSJ3aGl0ZSIsIGhpZ2g9IiNCMjFGNEUiLCBtaWRwb2ludD0xKSAKI3NjYWxlX2ZpbGxfZGlzdGlsbGVyKHBhbGV0dGU9ICJSZEJ1IikKI3RwbXRfZHNzcF9zY2hlbWF0aWMgPC0gZ2dwbG90KCkgKyBnZ3RpdGxlKCJUUE1UIG1lYW4gYWJ1bmRhbmNlIHNjb3JlcyIpICsKIyAgZ2VvbV9zZWdtZW50KGFlcyh4ID0gMSwgeSA9IDAsIHhlbmQgPSBtYXgodHBtdDFfZGF0YSRwb3NpdGlvbikpLCB5ZW5kID0gMCwgc2l6ZSA9IDEsIGNvbG9yID0gImdyZXk3MCIpICsKIyAgZ2VvbV9wb2ludChkYXRhID0gdHBtdDFfZGF0YSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJibGFjayIsIHNpemUgPSAxLjgpICsKIyAgZ2VvbV9wb2ludChkYXRhID0gc3Vic2V0KHRwbXQxX2RhdGEsIHNoZWV0ID09IDEpLCBhZXMoeCA9IHBvc2l0aW9uLCB5ID0gMCksIGNvbG9yID0gInBpbmsiLCBzaXplID0gMS41KSArCiMgIGdlb21fcG9pbnQoZGF0YSA9IHN1YnNldCh0cG10MV9kYXRhLCBoZWxpeCA9PSAxKSwgYWVzKHggPSBwb3NpdGlvbiwgeSA9IDApLCBjb2xvciA9ICJjeWFuIiwgc2l6ZSA9IDEuNSkgKwojICBzY2FsZV94X2NvbnRpbnVvdXMoYnJlYWtzID0gc2VxKDAsIDI1MCwgMTApLCBleHBhbmQgPSBjKDAsMCkpICsKIyAgc2NhbGVfeV9jb250aW51b3VzKGJyZWFrcyA9IE5VTEwsIGV4cGFuZCA9IGMoMCwwKSkgK3hsYWIoTlVMTCkgKyB5bGFiKE5VTEwpICsKIyAgdGhlbWUocGFuZWwuYm9yZGVyID0gZWxlbWVudF9ibGFuaygpLCBheGlzLnRleHQueCA9IGVsZW1lbnRfYmxhbmsoKSwgYXhpcy50ZXh0LnkgPSBlbGVtZW50X2JsYW5rKCkpCiN0cG10X2Rzc3Bfc2NoZW1hdGljCnBsb3QodHBtdF9wb3NfbWVhbl9vKQpwbG90KHRwbXRfaGVhdF9vKQpgYGAKCgpgYGB7cn0KCnNldC5zZWVkKDE1MykKaml0dGVyIDwtIHBvc2l0aW9uX2ppdHRlcih3aWR0aCA9IDEsIGhlaWdodCA9IE5VTEwpCmppdHRlcjEgPC1wb3NpdGlvbl9qaXR0ZXIod2lkdGggPSAwLjA4LCBoZWlnaHQgPSBOVUxMKQpqaXR0ZXIyIDwtIHBvc2l0aW9uX2ppdHRlcih3aWR0aD0wLjEzLCBoZWlnaHQgPSBOVUxMKQp0d2VudHlfY29sb3IgPSBjKCIjRDAyMDI4IiwgIiNFMUExMkYiLCAiI0VERDk0MSIsICIjRjJGMDhFIiwgIiNFRUM4OTgiLCAiI0JDRERBRSIsICIjQTRDMzNCIiwgIiM3NkMxNTgiLCAiIzg1NzgyRSIsICIjMzE1OTM1IiwgIiM1Mzk1OEIiLCAiI0ExREFFMCIsICIjNDg2RUI2IiwgIiNFNkEzQjQiLCAiI0M1QTBDQSIsICIjNTU0REEwIiwgIiM5OTI0N0UiLCAiIzQwMjA1OSIsICIjODI0MjFCIiwgIiM3RTgwN0UiLCAnYmxhY2snKQoKI3B0ZW5fa19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1zdGFydCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJLIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSkgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJMeXNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikKCnB0ZW5fa19zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiSyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJMeXNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiSyIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQpwdGVuX2tfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIksiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJMeXNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiSyIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCgpwdGVuX2dfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKHBvc2l0aW9uKSwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKGdyb3VwPWZhY3Rvcihwb3NpdGlvbikpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiR2x5Y2luZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCnB0ZW5fZ19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkdseWNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRyIpLCBhZXMoeD1lbmQsIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCnB0ZW5fZ19oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJHIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkdseWNpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIHcvIGh5ZHJvcGhvYmljaXR5IGNoYW5nZSIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkciKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9kaXN0aWxsZXIocGFsZXR0ZSA9ICJTcGVjdHJhbCIpCgpwdGVuX2Nfc3ByZWFkIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1wb3NpdGlvbikpICsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIikpICsgeGxhYigiUG9zaXRpb24gaW4gUFRFTiIpICsgZ2d0aXRsZSgiQ3lzdGVpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikKI2V4cGVyaW1lbnRfb3JpZwojcHRlbl9jX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PXBvc2l0aW9uLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoZ3JvdXA9cG9zaXRpb24lJTQ1MCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJDeXN0ZWluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRDAyMDI4IiwgIiNFMUExMkYiLCAiI0VERDk0MSIsICIjRjJGMDhFIiwgIiNFRUM4OTgiLCAiI0JDRERBRSIsICIjQTRDMzNCIiwgIiM3NkMxNTgiLCAiIzg1NzgyRSIsICIjMzE1OTM1IiwgIiM1Mzk1OEIiLCAiI0ExREFFMCIsICIjNDg2RUI2IiwgIiNFNkEzQjQiLCAiI0M1QTBDQSIsICIjNTU0REEwIiwgIiM5OTI0N0UiLCAiIzQwMjA1OSIsICIjODI0MjFCIiwgIiM3RTgwN0UiLCAnYmxhY2snKSkKIywgc2NhbGUgPSAiY291bnQiCiMrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSksIGFscGhhID0gMC41KQpwdGVuX2Nfc3ByZWFkMSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24sIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyhncm91cD1wb3NpdGlvbiUlNDUwKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUpLCBhbHBoYSA9IDAuNzUsIHBvc2l0aW9uPWppdHRlcjEpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCnB0ZW5fY19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQoKcHRlbl9jX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24sIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyhncm91cD1wb3NpdGlvbiUlNDUwKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkN5c3RlaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyB3LyBoeWRyb3Bob2JpY2l0eSBjaGFuZ2UiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJDIiksIGFlcyh4PXBvc2l0aW9uLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikKI2luIGluIGdlb21fdmlvbGluKGFlcygpKSAtPiBjb2xvdXIgPSBoeWRybzEKCgojcHRlbl9zX3NwcmVhZCA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9cG9zaXRpb24pKSArIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKQojcHRlbl9zX3NwcmVhZDFfb2xkIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1zdGFydCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSkgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJTZXJpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikKcHRlbl9zX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCnB0ZW5fc19hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikKCnB0ZW5fc19oeWRyb2RpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IChoeWRybzItaHlkcm8xKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMgdy8gaHlkcm9waG9iaWNpdHkgY2hhbmdlIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX2Rpc3RpbGxlcihwYWxldHRlID0gIlNwZWN0cmFsIikKI2dyYXBoaW5nIGFidW5kYW5jZSB2cyBjaGFuZ2UgaW4gaHlkcm9waG9iaWNpdHkKcHRlbl9zX2hoX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZmFjdG9yKGh5ZHJvMi1oeWRybzEpLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZmFjdG9yKGh5ZHJvMi1oeWRybzEpKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkNoYW5nZSBpbiBoeWRyb3Bob2JpY2l0eSIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZmFjdG9yKGh5ZHJvMi1oeWRybzEpLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKQojcHRlbl9zX2FhX2h5ZHJvZGlmZiA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSAoaHlkcm8yLWh5ZHJvMSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKI3B0ZW5fc19hYV92b2xkaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IHZvbGRpZmYpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUyIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIlNlcmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkKI3B0ZW5fc19hYV9wb2xkaWZmIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IHBvbGFyaXR5ZGlmZikpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKQojcHRlbl9zX2FhX3dlaWdodGRpZmYgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gd2VpZ2h0ZGlmZikpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJTIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiU2VyaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlMiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKQoKI3NwZWNpZmljIGFtaW5vIGFjaWQgdGVzdHMKIyNwbG90KHB0ZW5fa19zcHJlYWQpCiMjcGxvdChwdGVuX2dfc3ByZWFkKQojI3Bsb3QocHRlbl9jX3NwcmVhZCkKCiMjcGxvdChwdGVuX3Nfc3ByZWFkKQojI3Bsb3QocHRlbl9zX3NwcmVhZDFfb2xkKQpwbG90KHB0ZW5fc19oeWRyb2RpZmYpCiNwbG90KHB0ZW5fc19oaF9oeWRyb2RpZmYpICNwcm9iYWJseSBub3QgdmVyeSB1c2VmdWwuLi4gZG9lcyBub3QgdGFrZSBpbnRvIGFjY291bnQgcG9zaXRpb24gYW55bW9yZQojI3Bsb3QocHRlbl9zX2FhX2h5ZHJvZGlmZikKIyNwbG90KHB0ZW5fc19hYV92b2xkaWZmKQojI3Bsb3QocHRlbl9zX2FhX3BvbGRpZmYpCiMjcGxvdChwdGVuX3NfYWFfd2VpZ2h0ZGlmZikKCgojcGxvdChwdGVuX2Nfc3ByZWFkMSkKI3Bsb3QocHRlbl9jX2FhKQpwbG90KHB0ZW5fY19oeWRyb2RpZmYpCnBsb3QocHRlbl9zX3NwcmVhZDEpCiNwbG90KHB0ZW5fc19hYSkKI3Bsb3QocHRlbl9nX3NwcmVhZDEpCiNwbG90KHB0ZW5fZ19hYSkKcGxvdChwdGVuX2dfaHlkcm9kaWZmKQojcGxvdChwdGVuX2tfc3ByZWFkMSkKI3Bsb3QocHRlbl9rX2FhKQpgYGAKYGBge3J9CnB0ZW5fYV9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiQSIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBbGFuaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkEiKSwgYWVzKHg9ZmFjdG9yKHBvc2l0aW9uKSwgeT1zY29yZSksIGFscGhhID0gMC44NSwgcG9zaXRpb249aml0dGVyMikgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikKcHRlbl9hX2FhIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1lbmQsIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJBIiksIGFlcyhncm91cD1lbmQpLCBzY2FsZSA9ICJ3aWR0aCIpICsgeGxhYigiQW1pbm8gYWNpZCIpICsgZ2d0aXRsZSgiQWxhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJBIiksIGFlcyh4PWVuZCwgeT1zY29yZSksIGFscGhhID0gMC43NSwgcG9zaXRpb249aml0dGVyMSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPXR3ZW50eV9jb2xvcikKCnB0ZW5fcl9zcHJlYWQxIDwtIGdncGxvdChwdGVuMV9wcm9jX3d0LCBhZXMoeT1zY29yZSwgeD1mYWN0b3IocG9zaXRpb24pLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUiIpLCBhZXMoZ3JvdXA9ZmFjdG9yKHBvc2l0aW9uKSksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJQb3NpdGlvbiBpbiBQVEVOIikgKyBnZ3RpdGxlKCJBcmdhbmluZSB2YXJpYW50IGFidW5kYW5jZSBzY29yZXMiKSsgZ2VvbV9wb2ludChkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJSIiksIGFlcyh4PWZhY3Rvcihwb3NpdGlvbiksIHk9c2NvcmUpLCBhbHBoYSA9IDAuODUsIHBvc2l0aW9uPWppdHRlcjIpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz10d2VudHlfY29sb3IpCnB0ZW5fcl9hYSA8LSBnZ3Bsb3QocHRlbjFfcHJvY193dCwgYWVzKHk9c2NvcmUsIHg9ZW5kLCBjb2xvdXIgPSBlbmQpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzPWMoMC41KSwgZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiUiIpLCBhZXMoZ3JvdXA9ZW5kKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIkFtaW5vIGFjaWQiKSArIGdndGl0bGUoIkFyZ2FuaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIlIiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQoKcHRlbl9uX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJOIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkFzcGFyYWdpbmUgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiTiIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQpwdGVuX25fYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBc3BhcmFnaW5lIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIk4iKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQoKcHRlbl9kX3NwcmVhZDEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWZhY3Rvcihwb3NpdGlvbiksIGNvbG91ciA9IGVuZCkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXM9YygwLjUpLCBkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LCBzdGFydD09ICJEIiksIGFlcyhncm91cD1mYWN0b3IocG9zaXRpb24pKSwgc2NhbGUgPSAid2lkdGgiKSArIHhsYWIoIlBvc2l0aW9uIGluIFBURU4iKSArIGdndGl0bGUoIkFzcGFydGljIEFjaWQgdmFyaWFudCBhYnVuZGFuY2Ugc2NvcmVzIikrIGdlb21fcG9pbnQoZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCwgc3RhcnQ9PSAiRCIpLCBhZXMoeD1mYWN0b3IocG9zaXRpb24pLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjg1LCBwb3NpdGlvbj1qaXR0ZXIyKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQpwdGVuX2RfYWEgPC0gZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh5PXNjb3JlLCB4PWVuZCwgY29sb3VyID0gZW5kKSkgKyBnZW9tX3Zpb2xpbihkcmF3X3F1YW50aWxlcz1jKDAuNSksIGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkQiKSwgYWVzKGdyb3VwPWVuZCksIHNjYWxlID0gIndpZHRoIikgKyB4bGFiKCJBbWlubyBhY2lkIikgKyBnZ3RpdGxlKCJBc3BhcnRpYyBBY2lkIHZhcmlhbnQgYWJ1bmRhbmNlIHNjb3JlcyIpKyBnZW9tX3BvaW50KGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsIHN0YXJ0PT0gIkQiKSwgYWVzKHg9ZW5kLCB5PXNjb3JlKSwgYWxwaGEgPSAwLjc1LCBwb3NpdGlvbj1qaXR0ZXIxKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9dHdlbnR5X2NvbG9yKQoKCnBsb3QocHRlbl9hX3NwcmVhZDEpCnBsb3QocHRlbl9hX2FhKQpwbG90KHB0ZW5fcl9zcHJlYWQxKQpwbG90KHB0ZW5fcl9hYSkKcGxvdChwdGVuX25fc3ByZWFkMSkKcGxvdChwdGVuX25fYWEpCnBsb3QocHRlbl9kX3NwcmVhZDEpCnBsb3QocHRlbl9kX2FhKQoKCmBgYAoKYGBge3J9CiMgZ3JhcGggVkFNUC1zZXEgc2NvcmVzIHJlbGF0aXZlIHRvIHZhcmlhbnQgcG9zaXRpb24gaW4gcHJvdGVpbgojcHRlbgpwdGVuMV9oYm9uZCA8LSBwdGVuMV9wcm9jWyFpcy5uYShwdGVuMV9wcm9jJGhib25kX3N1bSksXQpwdGVuMV9oYm9uZCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9oYm9uZCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHB0ZW4xX2hib25kJGhlbGl4PT0xLCAiaGVsaXgiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2UocHRlbjFfaGJvbmQkc2hlZXQ9PTEsICJzaGVldCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9oYm9uZCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnB0ZW5fcGxvdF9oYm9uZCA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChhbHBoYT0wLjQpICsgeWxhYigiVkFNUC1zZXEgc2NvcmUiKSt4bGFiKCJEU1NQIFN1bSBvZiBoeWRyb2dlbiBib25kcyIpK2dndGl0bGUoIlBURU4gc2NvcmVzIGluIHJlbGF0aW9uIHRvIGh5ZHJvZ2VuIGJvbmRpbmciKSArIHNjYWxlX2NvbG9yX21hbnVhbCh2YWx1ZXM9YygiI0ZGNDg0OCIsICIjNjk2OTY5IiwgIiM1NzU3RkYiKSkgKyBsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpCnBsb3QocHRlbl9wbG90X2hib25kKQoKcHRlbl9wbG90X2hib25kMSA8LSBnZ3Bsb3QocHRlbjFfaGJvbmQsIGFlcyh4PWhib25kX3N1bSwgeT1zY29yZSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHlsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiRFNTUCBTdW0gb2YgaHlkcm9nZW4gYm9uZHMiKStnZ3RpdGxlKCJQVEVOIHNjb3JlcyBpbiByZWxhdGlvbiB0byBoeWRyb2dlbiBib25kaW5nIikKCiMgd2FzIGluIGFlcywgZ2dwbG90IGZ1bmN0aW9uIGNhbGwgLS0tPiBjb2xvdXI9c2Vjb25kYXJ5X3N0cnVjdAojc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkY0ODQ4IiwgIiMwMEM4NTMiLCAiIzU3NTdGRiIsICIjQTlBOUE5IikpICsgbGFicyhjb2xvdXI9IlNlY29uZGFyeSBTdHJ1Y3R1cmUiKSsKCnBsb3QocHRlbl9wbG90X2hib25kMSkKI2xlc3MgaHlkcm9nZW4gYm9uZHMgfiBoaWdoZXIgYWJ1bmRhbmNlCmBgYAoKYGBge3J9CiNzdG9yZSBsYXN0IGZvdXIKCiMgcGRmKCJwb3NpdGlvbl9oeWRyb2dlbl9ib25kcy5wZGYiKQojIHBsb3QocHRlbl9wb3MpCiMgcGxvdCh0cG10X3BvcykKIyBwbG90KHB0ZW5fcGxvdF9oYm9uZCkKIyBwbG90KHB0ZW5fcGxvdF9oYm9uZDEpCiMgZGV2Lm9mZigpCgpgYGAKYGBge3J9Cm5hbWUgPC0gYygnQWxhJywgJ0FyZycsICdBc24nLCAnQXNwJywgJ0N5cycsICdHbHUnLCAnR2xuJywgJ0dseScsICdIaXMnLCAnSWxlJywgJ0xldScsICdMeXMnLCAnTWV0JywgJ1BoZScsICdQcm8nLCAnU2VyJywgJ1RocicsICdUcnAnLCAnVHlyJywgJ1ZhbCcpCnF1YWxpdHkgPC0gYygnSHlkcm9waG9iaWMnLCAnQmFzaWMnLCAnUG9sYXIgTmV1dHJhbCcsICdBY2lkaWMnLCAnUG9sYXIgTmV1dHJhbCcsICdBY2lkaWMnLCAnUG9sYXIgTmV1dHJhbCcsICdHbHljaW5lJywgJ0Jhc2ljJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJywgJ0Jhc2ljJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJywgJ0h5ZHJvcGhvYmljJywgJ1BvbGFyIE5ldXRyYWwnLCAnUG9sYXIgTmV1dHJhbCcsICdIeWRyb3Bob2JpYycsICdIeWRyb3Bob2JpYycsICdIeWRyb3Bob2JpYycpCiNhYnVuZGFuY2UgPC0gZ2V0IGJldHRlciBzY2FsZQphYnVuZGFuY2UgPC0gYygwLjA4ODQsIDAuMDU3LCAwLjA0MTcsIDAuMDUzOSwgMC4wMTI0LCAwLjA2MjQsIDAuMDM4MiwgMC4wNzAzLCAwLjAyMjAsIDAuMDU5NSwgMC4wOTk0LCAwLjA1MjcsIDAuMDIzNywgMC4wNCwgMC4wNDcxLCAwLjA2NzIsIDAuMDU0MywgMC4wMTIxLCAwLjAzLCAwLjA2NzcpCiNpc29lbGVjdHJpYyBwb2ludCA8LSB1bmtub3duIHNvdXJjZSAobmNiaSkKaXNvZWxlY3RyaWMgPC0gYyg2LCAxMC44LCA1LjQsIDMsIDUsIDMuMiwgNS43LCA2LCA3LjYsIDYsIDYsIDkuNywgNS43LCA1LjUsIDYuMywgNS43LCA1LjYsIDUuOSwgNS43LCA2LjApCmhwX2tfZCA8LSBjKDEuOCwgLTQuNSwgLTMuNSwgLTMuNSwgMi41LCAtMy41LCAtMy41LCAtMC40LCAtMy4yLCA0LjUsIDMuOCwgLTMuOSwgMS45LCAyLjgsIC0xLjYsIC0wLjgsIC0wLjcsIC0wLjksIC0xLjMsIDQuMikKaHBfamFuaW4gPC1jKDAuMywgLTEuNCwgLTAuNSwgLTAuNiwgMC45LCAtMC43LCAtMC43LCAwLjMsIC0wLjEsIDAuNywgMC41LCAtMS44LCAwLjQsIDAuNSwgLTAuMywgLTAuMSwgLTAuMiwgMC4zLCAtMC40LCAwLjYpCiNNb25lcmEgZXQgYWwuLCBKLiBQcm90ZWluIFNjaSAocHJvICgtNDYpIG1heSBiZSBza2V0Y2gpCmhwX3BoNyA8LSBjKDQxLCAtMTQsIC0yOCwgLTU1LCA0OSwgLTMxLCAtMTAsIDAsIDgsIDk5LCA5NywgLTIzLCA3NCwgMTAwLCAtNDYsIC01LCAxMywgOTcsIDYzLCA3NikKaF9ib25kcyA8LSBjKDAsIDcsIDUsIDQsIDAsIDQsIDUsIDAsIDMsIDAsIDAsIDMsIDAsIDAsIDAsIDMsIDMsIDEsIDMsIDApCm1vbF93ZWlnaHQgPC1jKDcxLCAxNTYsIDExNCwgMTE1LCAxMDMsIDEyOSwgMTI4LCA1NywgMTM3LCAxMTMsIDExMywgMTI4LCAxMzEsIDE0NywgOTcsIDg3LCAxMDEsIDE4NiwgMTYzLCA5OSkKCmFtaW5vX2FjaWRzLmRhdGEgPC0gZGF0YS5mcmFtZShuYW1lLCBxdWFsaXR5LCBhYnVuZGFuY2UsIGlzb2VsZWN0cmljLCBocF9rX2QsIGhwX2phbmluLCBocF9waDcsIGhfYm9uZHMsIG1vbF93ZWlnaHQpCgpgYGAKCmBgYHtyfQoKaW1nID0gcmVhZEltYWdlKCIvVXNlcnMvZ28yYWx5c3NhL0Rlc2t0b3AvZGVuc2l0eV9wbG90cy5wbmciKQpkaXNwbGF5KGltZywgbWV0aG9kID0gInJhc3RlciIpCmBgYApWQU1QLXNlcSBhYnVuZGFuY2Ugc2NvcmUgZGVuc2l0eSBwbG90cyBmb3IgUFRFTiAodG9wKSBhbmQgVFBNVCAoYm90dG9tKSBub25zZW5zZSB2YXJpYW50cyAoYmx1ZSBkYXNoZWQgbGluZSksIHN5bm9ueW1vdXMgdmFyaWFudHMgKHJlZCBkYXNoZWQgbGluZSkgYW5kIG1pc3NlbnNlIHZhcmlhbnRzIChmaWxsZWQsIHNvbGlkIGxpbmUpLiBUaGUgbWlzc2Vuc2UgdmFyaWFudCBkZW5zaXRpZXMgYXJlIGNvbG9yZWQgYXMgZ3JhZGllbnRzIGJldHdlZW4gdGhlIGxvd2VzdCAxMCUgb2YgYWJ1bmRhbmNlIHNjb3JlcyAoYmx1ZSksIHRoZSBXVCBhYnVuZGFuY2Ugc2NvcmUgKHdoaXRlKSBhbmQgYWJ1bmRhbmNlIHNjb3JlcyBhYm92ZSBXVCAocmVkKS4KYGBge3J9CiNJZGVudGlmeWluZyBpdGVtcyBpbiB0YWlsIHRvIGludmVzdGlnYXRlCnB0ZW4xX25vbnNlbnNlIDwtIHN1YnNldChwdGVuMV9wcm9jLCBjbGFzcyA9PSAibm9uc2Vuc2UiKQp0cG10MV9ub25zZW5zZSA8LSBzdWJzZXQodHBtdDFfcHJvYywgY2xhc3MgPT0gIm5vbnNlbnNlIikKcHRlbjFfc3lub24gPC0gc3Vic2V0KHB0ZW4xX3Byb2MsIGNsYXNzID09ICJzeW5vbnltb3VzIikKdHBtdDFfc3lub24gPC0gc3Vic2V0KHRwbXQxX3Byb2MsIGNsYXNzID09ICJzeW5vbnltb3VzIikKCnB0ZW4xX25vX21pc3NlbnNlIDwtIHN1YnNldChwdGVuMV9wcm9jLCBjbGFzcyA9PSAic3lub255bW91cyIgfCBjbGFzcyA9PSAibm9uc2Vuc2UiKQoKZ2dwbG90KHB0ZW4xX25vbnNlbnNlLCBhZXMoeD1zY29yZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9LjAxLCBjb2xvdXI9ImJsdWUiLCBmaWxsPSJ3aGl0ZSIpIAojKyBnZW9tX2RlbnNpdHkoKQpnZ3Bsb3QocHRlbjFfc3lub24sIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShiaW53aWR0aD0uMDEsIGNvbG91cj0icmVkIiwgZmlsbD0id2hpdGUiKQoKZ2dwbG90KHB0ZW4xX3Byb2Nfd3QsIGFlcyh4PXNjb3JlKSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9wcm9jX3d0LGNsYXNzID09ICJub25zZW5zZSIpLCBmaWxsID0gInJlZCIsIGFscGhhID0gMC41LCBiaW53aWR0aD0uMDEpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfcHJvY193dCxjbGFzcyA9PSAic3lub255bW91cyIpLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNSwgYmlud2lkdGg9LjAxKSArIGdlb21faGlzdG9ncmFtKGRhdGE9c3Vic2V0KHB0ZW4xX3Byb2Nfd3QsY2xhc3MgPT0gIm1pc3NlbnNlIiksIGZpbGwgPSAiZ3JlZW4iLCBhbHBoYSA9IDAuMiwgYmlud2lkdGg9LjAxKQoKZ2dwbG90KHB0ZW4xX25vX21pc3NlbnNlLCBhZXMoeD1zY29yZSkpICsgZ2VvbV9oaXN0b2dyYW0oZGF0YT1zdWJzZXQocHRlbjFfbm9fbWlzc2Vuc2UsY2xhc3MgPT0gIm5vbnNlbnNlIiksIGZpbGwgPSAicmVkIiwgYWxwaGEgPSAwLjUsIGJpbndpZHRoPS4wMSkgKyBnZW9tX2hpc3RvZ3JhbShkYXRhPXN1YnNldChwdGVuMV9ub19taXNzZW5zZSxjbGFzcyA9PSAic3lub255bW91cyIpLCBmaWxsID0gImJsdWUiLCBhbHBoYSA9IDAuNSwgYmlud2lkdGg9LjAxKQoKZ2dwbG90KHRwbXQxX3N5bm9uLCBhZXMoeD1zY29yZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9LjAxLCBjb2xvdXI9InJlZCIsIGZpbGw9IndoaXRlIikKZ2dwbG90KHRwbXQxX25vbnNlbnNlLCBhZXMoeD1zY29yZSkpICsgZ2VvbV9oaXN0b2dyYW0oYmlud2lkdGg9LjAxLCBjb2xvdXI9ImJsdWUiLCBmaWxsPSJ3aGl0ZSIpCmBgYApgYGB7cn0KIzAuNTUKbm9uc2Vuc2VfdGFpbCA8LSBzdWJzZXQocHRlbjFfbm9uc2Vuc2UsIHNjb3JlID4gMC42KQpzeW5vbl90YWlsIDwtIHN1YnNldChwdGVuMV9zeW5vbiwgc2NvcmUgPCAwLjYpCm5vbnNlbnNlX3RhaWwkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEobm9uc2Vuc2VfdGFpbCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKG5vbnNlbnNlX3RhaWwkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShub25zZW5zZV90YWlsJHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uobm9uc2Vuc2VfdGFpbCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCnN5bm9uX3RhaWwkc2Vjb25kYXJ5X3N0cnVjdCA8LSBpZmVsc2UoaXMubmEoc3lub25fdGFpbCRoZWxpeCksICJ1bmtub3duIiwKICAgICAgICAgICAgICAgICAgICAgICAgaWZlbHNlKHN5bm9uX3RhaWwkaGVsaXg9PTEsICJoZWxpeCIsCiAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShzeW5vbl90YWlsJHNoZWV0PT0xLCAic2hlZXQiLAogICAgICAgICAgICAgICAgICAgICAgICBpZmVsc2Uoc3lub25fdGFpbCRoZWxpeD09MCwgIm5laXRoZXIiLAogICAgICAgICAgICAgICAgICAgICAgICAidW5rbm93biIpKSkpCgojZGF0YVtyb3csY29sdW1uXQpuX3RhaWwgPC0gbm9uc2Vuc2VfdGFpbFssYygxLDIsNywzMCwxMjcpXQpzX3RhaWwgPC0gc3lub25fdGFpbFssYygxLDIsNywzMCwxMjcpXQpuX3RhaWwkYnBfcG9zIDwtIChuX3RhaWwkcG9zaXRpb24tMSkqMwpzX3RhaWwkYnBfcG9zIDwtIChzX3RhaWwkcG9zaXRpb24tMSkqMwoKbl90YWlsCnNfdGFpbApgYGAKYGBge3J9CiNqdXN0IGluIGNhc2UgdGhlcmUgaXMgYSBkaXNjZXJuaWJsZSBwYXR0ZXJuCnNfdGFpbF9wb3MgPC0gZ2dwbG90KHNfdGFpbCwgYWVzKHg9cG9zaXRpb24sIHk9c2NvcmUsIGNvbG91cj1zZWNvbmRhcnlfc3RydWN0KSkrIGdlb21fcG9pbnQoc2l6ZT0uMykgKyBzY2FsZV94X2NvbnRpbnVvdXMobWlub3JfYnJlYWtzID0gc2VxKDAsIDQwNSwgNSkpICsgc2NhbGVfY29sb3JfbWFudWFsKHZhbHVlcz1jKCIjRkY0ODQ4IiwgIiMwMEM4NTMiLCAiIzU3NTdGRiIsICIjQTlBOUE5IikpICt5bGFiKCJWQU1QLXNlcSBzY29yZSIpK3hsYWIoIlBvc2l0aW9uIGluIFBURU4iKStsYWJzKGNvbG91cj0iU2Vjb25kYXJ5IFN0cnVjdHVyZSIpK2dndGl0bGUoIlBURU4gc3lub255bW91cyB2YXJpYW50IHRhaWwgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpwbG90KHNfdGFpbF9wb3MpCgojaGVscCB2aXN1YWxpemluZyBOTUQgcnVsZXMKbl90YWlsX3BvcyA8LSBnZ3Bsb3Qobl90YWlsLCBhZXMoeD1wb3NpdGlvbiwgeT1zY29yZSwgY29sb3VyPXNlY29uZGFyeV9zdHJ1Y3QpKSsgZ2VvbV9wb2ludChzaXplPS4zKSArIHNjYWxlX3hfY29udGludW91cyhtaW5vcl9icmVha3MgPSBzZXEoMCwgNDA1LCA1KSkgKyBzY2FsZV9jb2xvcl9tYW51YWwodmFsdWVzPWMoIiNGRjQ4NDgiLCAiIzAwQzg1MyIsICIjNTc1N0ZGIiwgIiNBOUE5QTkiKSkgK3lsYWIoIlZBTVAtc2VxIHNjb3JlIikreGxhYigiUG9zaXRpb24gaW4gUFRFTiIpK2xhYnMoY29sb3VyPSJTZWNvbmRhcnkgU3RydWN0dXJlIikrZ2d0aXRsZSgiUFRFTiBub25zZW5zZSB2YXJpYW50IHRhaWwgc2NvcmVzIGluIHJlbGF0aW9uIHRvIHByb3RlaW4gc3RydWN0dXJlIikgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9NDcsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTc4LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xMjIuNSwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MTQwLCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKSArIGdlb21fdmxpbmUoeGludGVyY2VwdD0xNjUsIGNvbG9yPSJibGFjayIsIHNpemU9LjEpICsgZ2VvbV92bGluZSh4aW50ZXJjZXB0PTE5NCwgY29sb3I9ImJsYWNrIiwgc2l6ZT0uMSkgKyBnZW9tX3ZsaW5lKHhpbnRlcmNlcHQ9MjA5LCBjb2xvcj0iYmxhY2siLCBzaXplPS4xKQpwbG90KG5fdGFpbF9wb3MpCmBgYAoKYGBge3J9CnNfdGFpbCRwcm9iX0FHX0dUIDwtIGMoMCwgMS82LCAxLzIsIDAsIDEvMiwgMS82KQpzX3RhaWwkcHJvYl90aXR2IDwtIGMoMCwgMi8zLCAyLzMsIDAsIDIvMywgMS8zKQpnZ3Bsb3Qobl90YWlsLCBhZXMoeD1wb3NpdGlvbix5PXNjb3JlKSkgKyBnZW9tX3BvaW50KCkgKyBnZW9tX3Ntb290aChtZXRob2QgPSAibG0iKQpnZ3Bsb3Qoc190YWlsLCBhZXMoeD1wcm9iX3RpdHYseT1zY29yZSkpICsgZ2VvbV9wb2ludCgpICsgZ2VvbV9zbW9vdGgobWV0aG9kID0gImxtIikKZ2dwbG90KHNfdGFpbCwgYWVzKHk9cHJvYl90aXR2LHg9c2NvcmUpKSArIGdlb21fcG9pbnQoKSArIGdlb21fc21vb3RoKG1ldGhvZCA9ICJsbSIpCnJzcSA8LSBmdW5jdGlvbiAoeCwgeSkgY29yKHgsIHkpXjIKbl9yc3EgPC0gcnNxKG5fdGFpbCRwb3NpdGlvbiwgc190YWlsJHNjb3JlKQpzX3JzcSA8LSByc3Eoc190YWlsJHByb2JfdGl0diwgc190YWlsJHNjb3JlKQpuX3JzcQpzX3JzcQojbm8gcmVsYXRpb25zaGlwLi4uCmBgYAoKYGBge3J9CiMgcHRlbjFfcHJvY193dCRzZWNvbmRhcnlfc3RydWN0IDwtIGlmZWxzZShpcy5uYShwdGVuMV9wcm9jX3d0JGhlbGl4KSwgInVua25vd24iLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JGhlbGl4PT0xLCAiaGVsaXgiLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JHNoZWV0PT0xLCAic2hlZXQiLAojICAgICAgICAgICAgICAgICAgICAgICAgIGlmZWxzZShwdGVuMV9wcm9jX3d0JGhlbGl4PT0wLCAibmVpdGhlciIsCiMgICAgICAgICAgICAgICAgICAgICAgICAgInVua25vd24iKSkpKQoKI3N0YXJ0IHBvc2l0aW9uIHdpdGhpbiBwdGVuIGdlbmUKIyBuX3RhaWwkc19wb3MgPC0gaWZlbHNlKChuX3RhaWwkYnBfcG9zX2N1bSk+ZTEsICgKIyAgIGlmZWxzZSgobl90YWlsJGJwX3Bvc19jdW0pID4gKGUxK2UyKSwgKAojICAgICBpZmVsc2UoKG5fdGFpbCRicF9wb3NfY3VtKSA+IChlMStlMitlMyksICgKIyAgICAgICBpZmVsc2UoKG5fdGFpbCRicF9wb3NfY3VtKSA+IChlMStlMitlMyksICgKIyAgICAgICAKIyAgICAgICApLCAobl90YWlsJGJwX3Bvc19jdW0rZTRfcykpCiMgICAgICksIChuX3RhaWwkYnBfcG9zX2N1bStlM19zKSkKIyAgICksIChuX3RhaWwkYnBfcG9zX2N1bStlMl9zKSkKIyApLCAobl90YWlsJGJwX3Bvc19jdW0rZTFfcykpCgojZW5kIHBvc2l0aW9uIHdpdGhpbiBwdGVuIGdlbmUKCiN3aXRoaW4gMiBhbWlubyBhY2lkcyBvZiBqdW5jdGlvbgoKCiMgI2UxX3MgaXMgdGhlIGZpcnN0IGJwIG9mIHRoZSBmaXJzdCBleG9uCiMgZTFfcyA9IDg5NjI0MjI3CiMgI2UxX2UgaXMgdGhlIGxhc3QgYnAgb2YgdGhlIGZpcnN0IGV4b24sIAojIGUxX2UgPSA4OTYyNDMwNQojICNlMSBpcyBsZW5ndGggaW4gYnAKIyBlbCA9IDc5CiMgZTIgPSA4NQojIGUzID0gNDUKIyBlNCA9IDQ0CiMgZTUgPSAyMzkKIyBlNiA9IDE0MgojIGU3ID0gMTY3CiMgZTggPSAyMjUKIyBlOSA9IDE4NgojIGUyX3MgPSA4OTY1Mzc4MgojIGUyX2UgPSA4OTY1Mzg2NgojIGUzX3MgPSA4OTY4NTI3MAkKIyBlM19lID0gODk2ODUzMTQJCiMgZTRfcyA9IDg5NjkwODAzCiMgZTRfZSA9IDg5NjkwODQ2CiMgZTVfcyA9IDg5NjkyNzcwCQojIGU1X2UgPSA4OTY5MzAwOAojIGU2X3MgPSA4OTcxMTg3NQkKIyBlNl9lID0gODk3MTIwMTYJCiMgZTdfcyA9IDg5NzE3NjEwCQojIGU3X2UgPSA4OTcxNzc3NgkKIyBlOF9zID0gODk3MjA2NTEJCiMgZThfZSA9IDg5NzIwODc1CQojIGU5X3MgPSA4OTcyNTA0NAojIGU5X2UgPSA4OTcyNTIyOQpgYGAKYGBge3J9Cgpnc19scygpCnRwbXRfcnVkZGxlIDwtIGdzX3RpdGxlKCJUUE1UX3J1ZGRsZSIpCnRwbXRfcmVhZCA8LSBnc19yZWFkKHNzPXRwbXRfcnVkZGxlLCB3cyA9ICJydWRkbGVfdHBtdF92YXJpYW50cyIpCnRwbXRfcnVkZGxlX2RhdGEgPC0gYXMuZGF0YS5mcmFtZSh0cG10X3JlYWQpCmBgYApgYGB7cn0KI3JldmVyc2luZyBkYXRhIHRvIGZpdCB0cG10MV9kYXRhCnJldmVyIDwtIGZ1bmN0aW9uKGRmPXRwbXRfcnVkZGxlX2RhdGEpe2RmPC1kZltkaW0oZGYpWzFdOjEsXX0KdHBtdF9ydWRkbGVfZGF0YV9yZXYgPSByZXZlcih0cG10X3J1ZGRsZV9kYXRhKQoKI2NyZWF0aW5nIHZhcmlhbnQgY29sdW1uLCBlcXVpdiB0byB0cG10MV9kYXRhJ3MKdHBtdF9ydWRkbGVfZGF0YV9yZXYkdmFyaWFudCA8LSBkby5jYWxsKHBhc3RlLCBjKHRwbXRfcnVkZGxlX2RhdGFfcmV2W2MoNSwyNCw2KV0sIHNlcD0iIikpCgojbWFraW5nIGJvdGggdGFibGVzIHNtYWxsZXIKdHBtdF9lc3NlbnRpYWwgPC0gdHBtdF9ydWRkbGVfZGF0YV9yZXZbLGMoMiwzLDQsNSw2LDE3LDE5LDI0LDI3LDI4LDI5LDMwLDMxLDMyLDMzLDM0LDM1LDc2LDc3LDc4LDEzNyldCnRwbXQxX3Byb2NfZXNzIDwtIHRwbXQxX3Byb2Nfd3RbLGMoMSwyLDMsNSw2LDcsMzAsMzIsODApXQoKI21lcmdpbmcgdGFibGVzIHdpdGggdmFyaWFudCBuYW1lCnRwbXRfbWVyZ2UgPC0gbWVyZ2UodHBtdDFfcHJvY19lc3MsIHRwbXRfZXNzZW50aWFsLCBieT0idmFyaWFudCIpCgojY29tcGFyaW5nIGFidW5kYW5jZSBzY29yZXMgd2l0aCB2YXJpb3VzIHNjb3JlcyBpbiBkYk5TRlAgKGNvbnRhaW5zIGFubm90YXRpb25zIG9mIGFsbCBwb3RlbnRpYWwgbm9uLXN5bm9ueW1vdXMgc2luZ2xlLW51Y2xlb3RpZGUgdmFyaWFudHMgKG5zU05WcykgaW4gdGhlIGh1bWFuIGdlbm9tZSkKdHBtdF9jb3IxIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFNJRlRfc2NvcmUpKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJTSUZUIHNjb3JlIikrZ2d0aXRsZSgiMSIpCnRwbXRfY29yMS41IDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFNJRlRfY29udmVydGVkX3JhbmtzY29yZSkpKSsgZ2VvbV9wb2ludChhbHBoYSA9IDAuMikgKyB4bGFiKCJWQU1QLXNlcSBzY29yZSIpK3lsYWIoIlNJRlQgY29udmVydGVkIHJhbmtzY29yZSIpK2dndGl0bGUoIjEuNSIpCnRwbXRfY29yNSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9c2NvcmUsIHk9Q0FERF9yYXdfcmFua3Njb3JlKSkrIGdlb21fcG9pbnQoYWxwaGEgPSAwLjIpICsgeGxhYigiVkFNUC1zZXEgc2NvcmUiKSt5bGFiKCJDQUREIHJhdyByYW5rc2NvcmUiKStnZ3RpdGxlKCI1IikKdHBtdF9jb3IyIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IRElWX3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhESVYgc2NvcmUiKStnZ3RpdGxlKCIyIikKdHBtdF9jb3IzIDwtIGdncGxvdCh0cG10X21lcmdlLCBhZXMoeD1zY29yZSwgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IVkFSX3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhWQVIgc2NvcmUiKStnZ3RpdGxlKCIzIikKdHBtdF9jb3IyLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hESVZfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhESVYgcmFua3Njb3JlIikrZ2d0aXRsZSgiMi41IikKdHBtdF9jb3IzLjUgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PXNjb3JlLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfcmFua3Njb3JlKSkpKyBnZW9tX3BvaW50KGFscGhhID0gMC4yKSArIHhsYWIoIlZBTVAtc2VxIHNjb3JlIikreWxhYigiUG9seXBoZW4yIEhWQVIgcmFua3Njb3JlIikrZ2d0aXRsZSgiMy41IikKCiNDQUREX3BocmVkIG5vdCB3b3J0aAoKI3Bsb3QodHBtdF9jb3I1KQojcGxvdCh0cG10X2NvcjEpCiNwbG90KHRwbXRfY29yMS41KQpwbG90KHRwbXRfY29yMikKcGxvdCh0cG10X2NvcjMpCnBsb3QodHBtdF9jb3IyLjUpCnBsb3QodHBtdF9jb3IzLjUpCmBgYApgYGB7cn0KVFBNVF9hYnVuX0NBREQgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1DQUREX3Jhd19yYW5rc2NvcmUpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYyggMC41KSkreWxhYigiQ0FERCByYXcgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikKcGxvdChUUE1UX2FidW5fQ0FERCkKClRQTVRfYWJ1bl9TSUZUX2NvbnYgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1hcy5udW1lcmljKFNJRlRfY29udmVydGVkX3JhbmtzY29yZSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYygwLjUpKSt5bGFiKCJTSUZUIGNvbnYgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikKcGxvdChUUE1UX2FidW5fU0lGVF9jb252KQoKVFBNVF9hYnVuX1BPTFkgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyh4PWFidW5kYW5jZV9jbGFzcywgeT1hcy5udW1lcmljKFBvbHlwaGVuMl9IRElWX3JhbmtzY29yZSkpKSArIGdlb21fdmlvbGluKGRyYXdfcXVhbnRpbGVzID0gYyggMC41KSkreWxhYigiUG9seXBoZW4yIEhESVYgcmFua3Njb3JlIikreGxhYigiQWJ1bmRhbmNlIENsYXNzIikKcGxvdChUUE1UX2FidW5fUE9MWSkKClRQTVRfYWJ1bl9QT0xZMSA8LSBnZ3Bsb3QodHBtdF9tZXJnZSwgYWVzKHg9YWJ1bmRhbmNlX2NsYXNzLCB5PWFzLm51bWVyaWMoUG9seXBoZW4yX0hWQVJfcmFua3Njb3JlKSkpICsgZ2VvbV92aW9saW4oZHJhd19xdWFudGlsZXMgPSBjKCAwLjUpKSt5bGFiKCJQb2x5cGhlbjIgSFZBUiByYW5rc2NvcmUiKSt4bGFiKCJBYnVuZGFuY2UgQ2xhc3MiKQpwbG90KFRQTVRfYWJ1bl9QT0xZMSkKYGBgCmBgYHtyfQoKUHJlZF9hYnVuX1NJRlQgPC0gZ2dwbG90KHRwbXRfbWVyZ2UsIGFlcyhhYnVuZGFuY2VfY2xhc3MpKSArIGdlb21fYmFyKGFlcyhmaWxsID0gU0lGVF9wcmVkKSkgKyBnZ3RpdGxlKCJBYnVuZGFuY2UgY2xhc3MgdnMgU0lGVCBwcmVkaWN0aW9uIG9mIERhbWFnaW5nIG9yIFRvbGVyYXRlZCIpCnBsb3QoUHJlZF9hYnVuX1NJRlQpCgp0cmlhbF9zZXAgPC0gdHBtdF9tZXJnZVtjKDIxLDIzLDI0LDI2KV0KdHBtdF9tZXJnZV9leHBhbmQgPC0gc2VwYXJhdGVfcm93cyh0cG10X21lcmdlLCBjKCJQb2x5cGhlbjJfSERJVl9zY29yZSIsICJQb2x5cGhlbjJfSERJVl9wcmVkIiwgIlBvbHlwaGVuMl9IVkFSX3Njb3JlIiwgIlBvbHlwaGVuMl9IVkFSX3ByZWQiKSkKClByZWRfYWJ1bl9IVkFSIDwtIGdncGxvdCh0cG10X21lcmdlX2V4cGFuZCwgYWVzKGFidW5kYW5jZV9jbGFzcykpICsgZ2VvbV9iYXIoYWVzKGZpbGwgPSBQb2x5cGhlbjJfSFZBUl9wcmVkKSkgKyBnZ3RpdGxlKCJBYnVuZGFuY2UgY2xhc3MgdnMgUG9seXBoZW4yIEhWQVIgcHJlZGljdGlvbnMiKSArIGxhYnMoc3VidGl0bGUgPSAiRDogUHJvYmFibHkgRGFtYWdpbmcsIFA6IFBvc3NpYmx5IERhbWFnaW5nLCBCOiBCZW5pZ24iKQpwbG90KFByZWRfYWJ1bl9IVkFSKQoKYGBgCgoKCg==